Tkinter面向对象开发:双窗口异常与进度条不更新问题求助
问题解答
问题1:出现第二个窗口的原因
- 你在
Window类中直接定义了类级别的button1、button2、button3和progressBar变量,创建这些控件时没有指定父容器(master)。Tkinter的规则是:如果创建控件时不指定父窗口,会自动生成一个默认的根窗口,这就是额外窗口的来源。 - 这些类级别的控件属于冗余代码,你在
__init__方法里又重新定义了同名局部变量,直接删掉即可。
问题2:进度条无法正常显示进度变化的原因
- 按钮的
command参数你传的是self.increment()、self.display()、self.button_clicked(),这是直接调用方法并把返回值传给command,而不是传递方法本身的引用。程序启动时这些方法就被执行了一次,之后点击按钮不会有任何反应,自然看不到进度条变化。 - 正确写法是去掉括号,直接传方法名:
command=self.increment、command=self.display、command=self.button_clicked。
修正后的完整代码
import tkinter from tkinter import ttk, Frame, Button, Label import logging # 初始化日志(按需配置) logging.basicConfig(level=logging.INFO) class Window(tkinter.Frame): # 按需求在__init__前声明progressBar类属性 progressBar = None def __init__(self, master): super().__init__(master) master.title("Prueba JVS") master.geometry("600x600") self.frame = Frame(master) self.frame.pack() leftframe = Frame(master) leftframe.pack(side=tkinter.LEFT) rightframe = Frame(master) rightframe.pack(side=tkinter.RIGHT) label = Label(self.frame, text="Genetic JVS App") label.pack() # 修正command参数,传递方法引用而非直接调用 button1 = Button(leftframe, text="Botón +", height=5, width=10, command=self.increment) button1.pack(padx=30, pady=3) button2 = Button(leftframe, text="Valor", height=5, width=10, command=self.display) button2.pack(padx=30, pady=3) button3 = Button(rightframe, text="Generar", height=5, width=10, command=self.button_clicked) button3.pack(padx=30, pady=3) # 初始化进度条并赋值给类属性 self.progressBar = ttk.Progressbar(self.frame, length=500) self.progressBar.configure(maximum=200) self.progressBar.pack(padx=10, pady=50) self.frame.pack(padx=50, pady=5) def increment(self): self.progressBar.step(20) def decrement(self): self.progressBar.step(-20) def reset(self): self.progressBar["value"] = 0 def display(self): print(self.progressBar["value"]) logging.info("Valor: %i", self.progressBar["value"]) def button_clicked(self): print('Button clicked') logging.info("Botón 3 pulsado.") self.progressBar.step(5) root = tkinter.Tk() window = Window(root) root.mainloop()
额外说明
- 关于你要求的“在
__init__方法前创建progressbar变量”,这里通过在类中声明progressBar = None的类属性实现,之后在__init__里赋值为实际的进度条实例,确保类方法中能正常调用。 - 代码补充了必要的导入语句(原代码缺少部分导入会报错),可根据你的环境调整。
内容的提问来源于stack exchange,提问作者Jorge Vega Sánchez
相关产品推荐
相关产品推荐

