【发布时间】:2019-04-03 03:17:27
【问题描述】:
假设我有一组使用 Tkinter 的类:
class MAIN(tk.Tk):
def __init__(self, *args):
...
class Page1(tk.Frame): #Login page Frame
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
...
def Method(self):
...
class Page2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
...
说Page2需要从Page1中使用Method(self),会怎么设计呢?
假设我们有 Tkinter 帧,每个帧都以类格式编写,所有帧都在 MAIN 类中启动。
我正在尝试做的,有一段时间没有成功,是让我的主菜单页面更新它的列表框,它接受并显示来自数据库的参数。例如,当我使用Page2 在数据库中插入另一行时,它必须让我回到Page1,但是,Page1 是静态的并且不会更新。我正在学习 UI,并且坚持了好几天。我有一个删除列表框参数的函数和一个再次显示参数的函数,但是,它们在Page1 中,一旦我从Page2 提出Page1 备份,Page1 将不会更新参数。
编辑:这是我需要在其他地方使用的方法的类(继续下面)
class mainMenuPage(tk.Frame): #Main Menu Frame, consists of the main navigation page, List box
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.listBox()
#self.listBox_delete(numrow)
self.label = tk.Label(self, text="Search employee by typing his/her last name:")
self.label.grid(row=0, column=1)
self.entry_username = tk.Entry(self)
self.entry_username.grid(row=0, column=3)
button = tk.Button(self, text='Add Employee', width=15,
command=lambda: (controller.clear_shared_data(), controller.raise_frame(addEmpFrame)))
button.grid(row=2, column=3)
button = tk.Button(self, text='Remove Employee', width=15, command=lambda: controller.raise_frame(removeEmpFrame))
button.grid(row=3, column=3)
button = tk.Button(self, text='Employee Lookup', width=15, command=lambda: controller.raise_frame(EmpLookupFrame))
button.grid(row=4, column=3)
button = tk.Button(self, text='Calculate Pay Roll', width=15, command=lambda: controller.raise_frame(calcPayRollFrame))
button.grid(row=5, column=3)
def listBox(self):
self.row = []
self.scrollbar = tk.Scrollbar(self)
self.scrollbar.grid(row=2, column=2)
connection: Connection = pymysql.connect(host='localhost',
port=3306,
user='root',
password='root',
db='hrdb')
cursorObject = connection.cursor()
cursorObject.execute('SELECT `firstName`,`lastName` from `employeeprofile`')
numrows = int(cursorObject.rowcount)
for x in range(0, numrows):
self.row.append(cursorObject.fetchone())
self.list1 = tk.Listbox(self, height=10, width=35)
for x in self.row:
self.list1.insert(END, x)
self.list1.grid(row=2, column=0, columnspan=2)
self.scrollbar.config(command=self.list1.yview)
return numrows
def listBox_delete(self, numrow):
self.list1 = tk.Listbox(self, height=10, width=35)
for x in range(0, numrow):
self.list1.delete('0', 'end')
self.list1.grid(row=2, column=0, columnspan=2)
self.list1 = tk.Listbox(self, height=10, width=35)
该类是我的 UI 的框架,基本上是一个主菜单导航器,其中包含来自 mySQL 的值的列表框。这里的问题是在程序中使用任何其他框架或操作导致我返回主菜单后,程序不会更新列表框list1,即当我将employee 添加到系统中时,新员工仅在我重新启动应用程序后才会显示在列表框中。 (这些方法适用于数据库)。我知道原因是框架是静态的,我的列表框只创建了一次,此后没有任何操作,但是,我找不到一种方法来基本上每次调用框架时生成列表框,然后得到所有再次从数据库中的值更新列表框。
【问题讨论】:
标签: python class user-interface tkinter