import tkinter
import time
import random
class App(tkinter.Tk):
def __init__(self):
super().__init__()
self.checkbutton_list = list()
self.set_window()
self.set_frame()
self.set_widget()
def set_window(self):
self.title("Automation Kit") # Set window title
self.rowconfigure(index=0, weight=1)
self.columnconfigure(index=0, weight=1)
self.columnconfigure(index=1, weight=1)
def set_frame(self):
self.frame_left = tkinter.LabelFrame(master=self, text="Device Info")
self.frame_left.grid(row=0, column=0, sticky=tkinter.NSEW)
self.frame_right = tkinter.LabelFrame(master=self, text="Commands")
self.frame_right.grid(row=0, column=1, sticky=tkinter.NSEW)
def set_widget(self):
# frame_left
tkinter.Button(master=self.frame_left, text="refresh", command=self.generate_checkbutton).pack()
self.generate_checkbutton()
# frame_right
tkinter.Button(master=self.frame_right, text="Reboot").pack()
tkinter.Button(master=self.frame_right, text="Reset Factory").pack()
def generate_checkbutton(self):
# 销毁checkbutton
for cb in self.checkbutton_list: # type:tkinter.Checkbutton
cb.destroy()
self.checkbutton_list.clear()
# 生成checkbutton
for i in range(random.randint(5, 8)):
text_checkbutton = tkinter.StringVar()
text_checkbutton.set(time.strftime('%H:%M:%S'))
checkbutton = tkinter.Checkbutton(master=self.frame_left, textvariable=text_checkbutton)
checkbutton.pack()
self.checkbutton_list.append(checkbutton)
if __name__ == "__main__":
app = App()
app.mainloop()
【优化】
-
可读性的改进: 在
set_widget()
方法中,最好将每个按钮的创建和布局分开,这样可以更清晰地阅读和维护代码。 -
注释: 尽管你的代码已经很清晰,但在一些关键的地方添加注释可以帮助他人更容易地理解你的代码,特别是在一些复杂的部分或者涉及到特定逻辑的地方。
-
类型提示: 在 Python 3.6 及更高版本中,你可以使用类型提示,特别是在涉及到自定义对象的情况下,这样可以提高代码的可读性和可维护性。
-
异常处理: 虽然在这个小型应用中似乎不太需要,但是在真实的应用程序中,最好添加一些异常处理,以确保程序的稳定性。例如,如果
generate_checkbutton()
方法中的某些操作失败了,你可以考虑添加一些异常处理来处理这种情况。
下面是一个稍微改进过的版本,主要是将 set_widget()
方法中的按钮创建和布局分开,并添加了一些注释和类型提示:
import tkinter
import time
import random
from tkinter import Button, Checkbutton, LabelFrame, StringVar
class App(tkinter.Tk):
def __init__(self):
super().__init__()
self.checkbutton_list = list()
self.set_window()
self.set_frame()
self.set_widget()
def set_window(self):
self.title("Automation Kit")
self.rowconfigure(index=0, weight=1)
self.columnconfigure(index=0, weight=1)
self.columnconfigure(index=1, weight=1)
def set_frame(self):
self.frame_left = LabelFrame(master=self, text="Device Info")
self.frame_left.grid(row=0, column=0, sticky=tkinter.NSEW)
self.frame_right = LabelFrame(master=self, text="Commands")
self.frame_right.grid(row=0, column=1, sticky=tkinter.NSEW)
def set_widget(self):
self.create_refresh_button()
self.layout_checkbuttons()
Button(master=self.frame_right, text="Reboot").pack()
Button(master=self.frame_right, text="Reset Factory").pack()
def create_refresh_button(self):
"""
创建刷新按钮,用于生成新的复选框
"""
Button(master=self.frame_left, text="Refresh", command=self.layout_checkbuttons).pack()
def layout_checkbuttons(self):
"""
布局复选框
"""
for cb in self.checkbutton_list: # type:tkinter.Button
cb.destroy() # 清除原有布局
self.checkbutton_list.clear()
for i in range(random.randint(5, 8)):
text_checkbutton = StringVar()
text_checkbutton.set(time.strftime('%H:%M:%S'))
checkbutton = Checkbutton(master=self.frame_left, textvariable=text_checkbutton)
checkbutton.pack()
self.checkbutton_list.append(checkbutton)
if __name__ == "__main__":
app = App()
app.mainloop()