在Windows系统中有一个已知问题,在主循环第一次完全循环之前使用filedialog会导致这种焦点问题。
最初我用
after()
安排文件对话框在第一个循环完成后某个时间发生,但要感谢
fhdrsdg's
注释有一种更简单的方法可以使用
update_idletasks()
.
这里是重新编写的代码,用于解决焦点问题和一些常规清理。
import tkinter as tk
from tkinter import filedialog
class Model:
def __init__(self):
self.scores = []
self.position = 0
self.first_name = ""
self.last_name = ""
class WelcomeWindow(tk.Tk):
def __init__(self):
super().__init__()
button_width = 25
button_height = 10
self.frame = tk.Frame(self)
self.directory = ''
self.canvas = tk.Canvas(self.frame, height=600, width=800)
self.model = Model()
self.first_name_entry = tk.Entry(self.frame)
self.last_name_entry = tk.Entry(self.frame)
self.slider = tk.Scale(self.frame, length=button_width * 20, width=button_width * 2, sliderlength=150, showvalue=False,
from_=-3.00, to=3.00, orient="horizontal", tickinterval=1, label="Here is a slider", resolution=0.01)
self.frame.pack()
self.first_name_entry.pack()
self.last_name_entry.pack()
self.canvas.pack()
self.slider.pack()
self.update_idletasks() # adding this here fixes the focus issue
self.directory = filedialog.askdirectory()
def main():
WelcomeWindow().mainloop()
if __name__ == "__main__":
main()