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