You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:05:37