在运行程序时用Python更新Tkinter Gui

时间:2017-03-14 22:27:05

标签: python-2.7 user-interface tkinter

所以我写的程序基本上从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()

2 个答案:

答案 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循环将继续正常运行。