所以我写的程序基本上从CSV文件中检索信息并将其放入SQLite数据库。我正在尝试为它制作一个GUI来显示所选信息。 在下面的代码中,"来自Populate_DB import *"给我一些功能,我把它放在按钮上(基本上构建数据库)。
我要做的是拥有具有构建数据库功能的GUI(两个导入按钮),当我按下' baseButton'使用来自DB的数据(通过List_base函数)构建一个列表,并将其放入组合框中。
然而这并不起作用,因为在构建数据库之后我无法更新progrom,然后构建基本列表(进入变量' dropdownVals')。有没有办法让程序更新?后来我想通过从组合框(你可以选择的基本名称)中获取输入作为新列表的输入(在此基础上出售的项目列表 - 它基本上是来自游戏自由职业者)。我可以以某种方式使用.update()或类似的东西吗?我没有让它发挥作用。
from Tkinter import *
import csv, sqlite3, sys
from Populate_DB import *
from ttk import Combobox
dropdownVals = []
def List_bases():
sql = cur.execute('SELECT DISTINCT Base FROM Commodities')
data = cur.fetchall()
for i in data:
neat = ' '.join(map(str, (i)))
dropdownVals.append(neat)
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.drop = Combobox(frame, values=dropdownVals)
self.drop.grid(row=1, column=2, sticky='w', padx=5, pady=5)
self.quitButton = Button(frame, text="QUIT", fg="red", cnf={},
command=quit)
self.quitButton.grid(row=5, column=0, sticky='w', padx=5, pady=5)
self.importButton = Button(frame, text="Import data",
command=self.de)
self.importButton.grid(row=1, column=0, sticky='w', padx=5, pady=5)
self.importCleanButton = Button(frame, text="Import clean",
command=self.de_c)
self.importCleanButton.grid(row=2, column=0, sticky='w', padx=5,
pady=5)
self.baseButton = Button(frame, text="Bases", command=self.base)
self.baseButton.grid(row=3, column=0, sticky='w', padx=5, pady=5)
def de(self):
data_entry()
def de_c(self):
data_entry_clean()
def base(self):
List_bases()
print "bases!"
root = Tk()
app = App(root)
root.mainloop()
答案 0 :(得分:0)
首先,下次你给我们一个例子,我们可以在不修改代码的情况下运行。例如,这里不需要整个数据库。问题不在于数据库,而在于组合框的更新。
解决方案非常简单。组合框不会引用你的dropdownVals而是复制它。所以改变dropdownVals不会影响Tkinter。每次更新时,您都必须将dropdownVals提供给下拉框:
from Tkinter import *
import csv, sqlite3, sys
#from Populate_DB import *
from ttk import Combobox
def List_bases():
"""sql = cur.execute('SELECT DISTINCT Base FROM Commodities')
data = cur.fetchall()
for i in data:
neat = ' '.join(map(str, (i)))
dropdownVals.append(neat)
"""
dropdownVals = []
for i in ["test1", "test2"]:
dropdownVals.append(i)
return dropdownVals
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
dropdownVals = []
self.drop = Combobox(frame, values=dropdownVals)
self.drop.grid(row=1, column=2, sticky='w', padx=5, pady=5)
self.quitButton = Button(frame, text="QUIT", fg="red", cnf={},
command=quit)
self.quitButton.grid(row=5, column=0, sticky='w', padx=5, pady=5)
self.importButton = Button(frame, text="Import data",
command=self.de)
self.importButton.grid(row=1, column=0, sticky='w', padx=5, pady=5)
self.importCleanButton = Button(frame, text="Import clean",
command=self.de_c)
self.importCleanButton.grid(row=2, column=0, sticky='w', padx=5,
pady=5)
self.baseButton = Button(frame, text="Bases", command=self.base)
self.baseButton.grid(row=3, column=0, sticky='w', padx=5, pady=5)
def de(self):
data_entry()
def de_c(self):
data_entry_clean()
def base(self):
dropdownVals = List_bases()
self.drop.config(values=dropdownVals)
print "bases!"
root = Tk()
app = App(root)
root.mainloop()
答案 1 :(得分:0)
我使用python3中的线程库找到了解决此问题的方法:
import threading
from tkinter import *
class MyApp():
#my app code
def __init__(self, mywin):
self.mywin = mywin
mywin = Tk()
myapp = MyApp(mywin)
def mainloop():
while True:
#my loop function
threading.Thread(target=mainloop).start()
mywin.mainloop()
简而言之,线程库将使您的循环在后台运行,而tkinter循环将继续正常运行。