2017-05-11 3 views
0

ボタンをクリックすると、SQLクエリが実行され、SQL行がTkinterエントリ行を更新します。 新しいSQLクエリがTkinterエントリ行を埋めるのに十分な行を生成しない限り、すべての行は削除またはリセットされません。Python SQLクエリの結果を確認し、それに応じて更新する方法

SQLクエリで1つの名前しか生成されない場合、self.output0だけが新しいSQLデータでリセットされます。

SQLクエリで2つの名前しか生成されない場合、self.output0 AND self.output1のみが新しいSQLデータでリセットされます。

SQLクエリで10の名前が生成された場合、self.output0 THROUGH self.output10は新しいSQLデータでリセットされます。

ボタンをクリックするたびにすべてのTkinter Entryをリセットしたいと思います。特定の行にSQL出力がない場合、Tkinter Entry行は空白になります。

これについてSQLをチェックして正しく更新する方法に関するアイデアはありますか?

更新結果には、行数のタプルが必要です。だから私は結果が10未満であるかどうかを確認する必要があると思います。そうであれば残りの部分を取り出し、Tkinterを使用して残りの数字に関連付けられた行を削除する必要があります。

Tkinterは現在、何に関係なくすべての行を更新しています。 SQLが何らかの理由で新しい行を提供しない場合、Tkinterは古いクエリからデータを引き出します。

import os 
    import pypyodbc 
    import tkinter 
    from tkinter import ttk 
    from tkinter import messagebox 
    from tkinter import BOTH, END, LEFT 


    class Adder(ttk.Frame): 
    """The adders gui and functions.""" 
    def __init__(self, parent, *args, **kwargs): 
     ttk.Frame.__init__(self, parent, *args, **kwargs) 
     self.root = parent 
     self.init_gui() 

    def calculate(self): 
     firstname = str(self.first_entry.get()) 
     lastname = str(self.last_entry.get())  
     license = str(self.lic_entry.get()) 
     if (firstname and not lastname and not license): # "You entered first name." 

      try: 
       connection = pypyodbc.connect('Driver={SQL Server};Server=MYSERVER;Database=MYDATABASE;Trusted_Connection=yes;') 
      except pypyodbc.Error as ex: 
       sqlstate = ex.args[0] 
       if sqlstate == '28000': 
        self.answer_label['text'] = "You do not have access." 
      cursor = connection.cursor() 
      SQLCommand = ("SELECT LASTNAME, FIRSTNAME, L_LICNUMBER "  
       "FROM dbo.My_table " # table name 
       "with (nolock)" 
       "WHERE FIRSTNAME = ?") 
      Values = [firstname] 
      cursor.execute(SQLCommand,Values) 
      results = cursor.fetchmany(20) 
      if results: 


       self.output0.delete(0, END) 
       self.output0.insert(0,results[0]) 
       self.output1.delete(0, END) 
       self.output1.insert(0,results[1]) 
       self.output2.delete(0, END) 
       self.output2.insert(0,results[2]) 
       self.output3.delete(0, END) 
       self.output3.insert(0,results[3]) 
       self.output4.delete(0, END) 
       self.output4.insert(0,results[4]) 
       self.output5.delete(0, END) 
       self.output5.insert(0,results[5]) 
       self.output6.delete(0, END) 
       self.output6.insert(0,results[6]) 
       self.output7.delete(0, END) 
       self.output7.insert(0,results[7]) 
       self.output8.delete(0, END) 
       self.output8.insert(0,results[8]) 
       self.output9.delete(0, END) 
       self.output9.insert(0,results[9]) 
       connection.close() 

    def init_gui(self): 
     """Builds GUI.""" 

     self.root.option_add('*tearOff', 'FALSE') 

     self.grid(column=0, row=0, sticky='nsew') # this starts the entire form 


     # Input Boxes and Button 

     self.first_entry = tkinter.Entry(self, width=28) # first input box 
     self.first_entry.grid(sticky='', column=1, row=1) 

     self.last_entry = tkinter.Entry(self, width=28) # second input box 
     self.last_entry.grid(sticky='', column=2, row=1) 

     self.lic_entry = tkinter.Entry(self, width=28) # third input box 
     self.lic_entry.grid(sticky='', column=3, row=1) 


     self.calc_button = ttk.Button(self, text='Search', command=self.calculate) # button 
     self.calc_button.grid(column=4, row=1, columnspan=1, sticky='w', padx=14) 

     # Output frame for answers 

     self.output0 = tkinter.Entry(self, width=150, bd=0,) 
     self.output0.grid(column=0, row=6, columnspan=5, padx=100, pady=0) 
     self.output1 = tkinter.Entry(self, width=150, bd=0,) 
     self.output1.grid(column=0, row=7, columnspan=5, padx=100, pady=0) 
     self.output2 = tkinter.Entry(self, width=150, bd=0,) 
     self.output2.grid(column=0, row=8, columnspan=5, padx=100, pady=0) 
     self.output3 = tkinter.Entry(self, width=150, bd=0,) 
     self.output3.grid(column=0, row=9, columnspan=5, padx=100, pady=0) 
     self.output4 = tkinter.Entry(self, width=150, bd=0,) 
     self.output4.grid(column=0, row=10, columnspan=5, padx=100, pady=0) 
     self.output5 = tkinter.Entry(self, width=150, bd=0,) 
     self.output5.grid(column=0, row=11, columnspan=5, padx=100, pady=0) 
     self.output6 = tkinter.Entry(self, width=150, bd=0,) 
     self.output6.grid(column=0, row=12, columnspan=5, padx=100, pady=0) 
     self.output7 = tkinter.Entry(self, width=150, bd=0,) 
     self.output7.grid(column=0, row=13, columnspan=5, padx=100, pady=0) 
     self.output8 = tkinter.Entry(self, width=150, bd=0,) 
     self.output8.grid(column=0, row=14, columnspan=5, padx=100, pady=0) 
     self.output9 = tkinter.Entry(self, width=150, bd=0,) 
     self.output9.grid(column=0, row=15, columnspan=5, padx=100, pady=0)  


    if __name__ == '__main__': 
    root = tkinter.Tk() 
    Adder(root) 
    root.resizable(width=False, height=False) # locks window from being resized 
    root.mainloop() 

ボタンは、現在のSQLクエリによって変更されている特定の行数のみをリセットします。

答えて

0

応募変数を保持するための配列を使用して、ちょうどすべてに助けブライアンのための

def init_gui(self): 
    ... 
    self.entries = [] 
    for row in range(10): 
     entry = tkinter.Entry(self, width=150, bd=0,) 
     entry.grid(column=0, row=row+6, columnspan=5, padx=100, pady=0) 
     self.entries.append(entry) 
    ... 
... 
def calculate(self): 
    ... 
    # delete all of the old data 
    for entry in self.entries: 
     entry.delete(0, "end") 

    # insert the new data 
    # Note: if there are fewer results than entries, zip will 
    # return only as many items as there are results 
    for (entry, value) in zip(self.entries, result): 
     entry.insert(0, value) 
+0

感謝をリセットするために、配列を反復。私はあなたの例を見て、それを働かそうとしています。現在は動作していませんが、これで正しい軌道に乗っていますか? https://paste.ofcode.org/Q5brVGwqb7NzTHjR7iz3dP私は実際には、すべての行ごとに新しいSQLクエリを実行することで自分のプログラムを動作させましたが、それは効率的ではないようです。 – Prox

関連する問題