python - 寻找一种有效的方法来重用一组小部件或替代方法
问题描述
这是我目前拥有的:
这是使用相当多的代码创建的,仅用于 1 个小部件:
date_label = tk.Label(date_entry_frame, text="Enter creation timestamp: ")
date_label.pack(side=tk.TOP)
label_0 = tk.Label(date_entry_frame, text='DD/MM/YY:')
label_0.pack(side=tk.LEFT)
entry_1 = tk.Entry(date_entry_frame, width=2, borderwidth=1)
label_1 = tk.Label(date_entry_frame, text='/', borderwidth=0)
entry_2 = tk.Entry(date_entry_frame, width=2, borderwidth=1)
label_2 = tk.Label(date_entry_frame, text='/', borderwidth=0)
entry_3 = tk.Entry(date_entry_frame, width=4, borderwidth=1)
# time entries and labels
label_3 = tk.Label(date_entry_frame, text='HH:MM', borderwidth=0)
entry_4 = tk.Entry(date_entry_frame, width=2, borderwidth=1)
label_4 = tk.Label(date_entry_frame, text=':', borderwidth=0)
entry_5 = tk.Entry(date_entry_frame, width=2, borderwidth=1)
# space management
entry_1.pack(side=tk.LEFT)
label_1.pack(side=tk.LEFT)
entry_2.pack(side=tk.LEFT)
label_2.pack(side=tk.LEFT)
entry_3.pack(side=tk.LEFT)
label_3.pack(side=tk.LEFT)
entry_4.pack(side=tk.LEFT)
label_4.pack(side=tk.LEFT)
entry_5.pack(side=tk.LEFT)
有其他选择吗?还是一种无需复制粘贴大块代码即可重用它的方法?我尝试过使用类,但我不知道如何将管理空间与类一起使用。
解决方案
tkinter 的答案与任何语言的任何大块代码没有什么不同:将代码移动到函数或类中。
可以说最好的解决方案是将其移动到从 Frame 小部件继承的类中。这允许您将类的实例视为一流的小部件(例如:您可以在它们上调用pack
、place
、grid
和destroy
)。
例如,您希望能够像这样使用该类:
start = DateTimeEntry(root, "Enter start time", 1, 1, 2019, 0, 0)
end = DateTimeEntry(root, "Enter end time", 31, 12, 2019, 0, 0)
start.pack(side="top", fill="x")
end.pack(side="top", fill="x")
class DateTimeEntry(tk.Frame):
def __init__(self, master, label, day=1, month=1, year=2000, hour=0, minute=0):
super().__init__(master)
date_label = tk.Label(self, text=label)
label_0 = tk.Label(self, text='DD/MM/YY:')
label_1 = tk.Label(self, text='/', borderwidth=0)
label_2 = tk.Label(self, text='/', borderwidth=0)
label_3 = tk.Label(self, text='HH:MM', borderwidth=0)
label_4 = tk.Label(self, text=':', borderwidth=0)
self.entry_day = tk.Entry(self, width=2, borderwidth=1)
self.entry_month = tk.Entry(self, width=2, borderwidth=1)
self.entry_year = tk.Entry(self, width=4, borderwidth=1)
self.entry_hour = tk.Entry(self, width=2, borderwidth=1)
self.entry_minute = tk.Entry(self, width=2, borderwidth=1)
date_label.pack(side=tk.TOP, fill="x")
label_0.pack(side=tk.LEFT)
self.entry_day.pack(side=tk.LEFT)
label_1.pack(side=tk.LEFT)
self.entry_month.pack(side=tk.LEFT)
label_2.pack(side=tk.LEFT)
self.entry_year.pack(side=tk.LEFT)
label_3.pack(side=tk.LEFT)
self.entry_hour.pack(side=tk.LEFT)
label_4.pack(side=tk.LEFT)
self.entry_minute.pack(side=tk.LEFT)
self.set(day, month, year, hour, minute)
def get(self):
return (
(self.entry_day.get(), self.entry_month.get(), self.entry_year.get()),
(self.entry_hour.get(), self.entry_minute.get())
)
def reset(self):
self.entry_day.delete(0, "end")
self.entry_month.delete(0, "end")
self.entry_year.delete(0, "end")
self.entry_hour.delete(0, "end")
self.entry_minute.delete(0, "end")
def set(self, day, month, year, hour, minute):
self.reset()
self.entry_day.insert(0, day)
self.entry_month.insert(0, month)
self.entry_year.insert(0, year)
self.entry_hour.insert(0, hour)
self.entry_minute.insert(0, minute)
推荐阅读
- java - Espresso UI 测试的自动授予权限
- android - 无法使用 youtube 视频 url 在本机反应(适用于 android)中播放视频
- java - 如何解决android中的Firebase API初始化失败?
- unity3d - Unity Multiplayer:当 Y 轴小于 -2 时重置玩家位置
- tree - k树的秩
- java - 是否有用于检查字符串参数模式的 android 注释?
- wpf - 使用 ControlTemplate 时绑定分离问题
- python - 如何无限开始循环
- powershell - 用数组值替换数组值
- vba - vba 在旧的数据访问方法上崩溃