Tkinter按钮只能工作一次

时间:2016-04-22 00:47:39

标签: python tkinter

在这个MainFrame类中,我有4个按钮,每个按钮在单击时在新窗口中导入一个类(Update除外)。我可以单击每个按钮一次,但是如果我尝试再次单击某个按钮,则不会弹出任何新窗口,也不会发生任何事情。为什么每个按钮只能工作一次?

  from tkinter import *
import tkinter.messagebox as tm
import Users
import re
import sqlite3

db = sqlite3.connect('game nebula.db')
c = db.cursor()


class MainFrame(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)

        self.master = master
        self.mainUI()

    def mainUI(self):

        self.master.title("Games Nebula")
        self.pack(fill=BOTH, expand=True)

        frame1 = Frame(self)
        frame1.pack(fill=X)
        frame2 = Frame(self)
        frame2.pack(fill=X)
        frame3 = Frame(self)
        frame3.pack(fill=X)

        self.label_1 = Label(frame1, text="Welcome to Games Nebula!", fg='green', relief='groove', width='40')
        self.label_1.pack(side=TOP, padx=5, pady=5)

        self.searchbtn = Button(frame2, text="Browse Games", fg='green', command = self._search_btn_clicked)
        self.searchbtn.pack(side=LEFT, padx=25, pady=10)
        self.addbtn = Button(frame2, text="Add games", fg='green', command=self._addbtn_btn_clicked)
        self.addbtn.pack(side=RIGHT, padx=25, pady=10)
        self.updatebtn = Button(frame3, text="Update", fg='green', command=self._update_btn_clicked)
        self.updatebtn.pack(side=LEFT, padx=40, pady=10)
        self.deletebtn = Button(frame3, text="Delete Games", fg='green', command=self._delete_btn_clicked)
        self.deletebtn.pack(side=RIGHT, padx=25, pady=10)


    def _search_btn_clicked(self):
        print("Searching")
        import GameSearch


    def _addbtn_btn_clicked(self):
         import Add

    def _update_btn_clicked(self):
        print("Updating")

    def _delete_btn_clicked(self):
        import Delete


root = Tk()
root.geometry("300x200+300+300")
lf = MainFrame(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

因为模块只导入一次:导入模块后,python会引用它而不再导入它。

这是不好的做法,所以不要这样做,但是如果你想强制重新导入,你可以这样做:

import importlib

importlib.reload(module_name)  # attention: the module must have been 
                               #            imported first for this to work

单击按钮,我无法确定您想要导入(和重新导入)模块的原因。

答案 1 :(得分:0)

您实际想要做的是在每个模块中重复运行一些代码。 AS RB解释说,反复导入模块不会那样做。您应该做的是在导入后可以调用的模块中定义的函数和类。如果没有其他内容,请在定义“添加”按钮时将所有内容包装在名为main的函数中并使用,例如command=Add.main。 (首先将import Add放在程序的顶部。)

在导入模块时,只需定义对象并将其绑定到名称,就可以轻松测试模块,而不会产生像长时间运行的计算和打开窗口这样的副作用。