动态帧内容python3 tkinter

时间:2017-09-04 03:40:05

标签: python-3.x tkinter sqlite widget

好的,我正在python(3)tkinter中构建一个Sqlite浏览器 这是问题所在。如果你查看我的代码

代码来自:http://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter

许可证:http://creativecommons.org/licenses/by-sa/3.0/

import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from sqlite3 import *
import operator

file = 'chinook.db'
conn = connect(file)
c = conn.cursor()
c.execute("SELECT name FROM sqlite_master WHERE type = 'table'")
tables = c.fetchall()
tmplist = []
for i in tables:
    tmplist.append(i[0])
LARGE_FONT= ("Verdana", 12)
print("done",tables)

global tabnam
tabnam = ''
def asign(sigh): #ok, yeah it was late and i didnt care much about naming convention
    tabnam = sigh
    #this function is supposed to assign the value given to the variable


def combine_funcs(*funcs):
    def combined_func(*args, **kwargs):
        for f in funcs:
            f(*args, **kwargs)
    return combined_func
    #wrapper function
class SeaofBTCapp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)


        tk.Tk.wm_title(self, "Sea of BTC Client")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, PageOne):

            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

       self.show_frame(StartPage)

       def show_frame(self, cont):

           frame = self.frames[cont]
           frame.tkraise()
print("done")

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)

        label = ttk.Label(self, text=file, font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        for i in tmplist:

            button = ttk.Button(self, text="Visit Page " + str(i),
                       command=lambda:controller.show_frame(PageOne))
            button.pack()


print("done")

class PageOne(tk.Frame):


    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text='values', font=LARGE_FONT)
        label.pack(pady=10,padx=10)



        button1 = ttk.Button(self, text="Back to Home",command=lambda: controller.show_frame(StartPage))
        button1.pack()

        try:
            c.execute("select * from {y}".format(y=tabnam))

            for i in c.fetchall():
                label = ttk.Label(text=i[0], font=LARGE_FONT)
                label.pack(pady=10,padx=20)

        except Exception as e:
            print(e) # the error message indicates that the string formating identifies tabnam as "  "
print("done")



app = SeaofBTCapp()
print("done")
app.mainloop()
print("done")

我正在尝试迭代sqlite查询。意思是:我做到了这一点,每张桌子都有tkinter创建一个按钮。这有效。 Tkinter显示一个按钮,其中包含每个表的名称。现在,我希望此代码能够在单击该按钮时显示该表中的每个值。我已经创建了一个包装函数来显示框架并重新分配tabnam的当前值,该变量代表用户点击的表名;单击该按钮时,我重新分配名为tabnam的全局变量的值。但是在按钮完成之前,python只是继续并执行查询(因为用户没有点击按钮而尚未格式化)并且抛出了一个错误。我该如何解决这个问题?

0 个答案:

没有答案