gpt4 book ai didi

python - Tkinter 进度条在 Windows 下不工作

转载 作者:太空宇宙 更新时间:2023-11-03 17:22:43 27 4
gpt4 key购买 nike

我正在编写一个将在 Linux 和 Windows 下使用的应用程序。

对于 GUI,我使用 Tkinter,但当我尝试在 Windows 上运行程序时遇到问题。在我开发它的 Linux 上,它运行得很好。

在程序/GUI 显示之前,我使用带有 ttk 进度条的顶层来显示加载数据的进度。Windows 上缺少此进度条。它不会抛出错误,它只是似乎不存在。它应该所在的位置是透明的,因此您可以看到顶层后面的窗口/桌面等。

有什么想法为什么会发生这种情况吗?还有其他人遇到过这个问题吗?

这是调用顶层的代码:

import Tkinter as tk
import ttk
import platform
import time

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.init_progbar()
self.prog_data()
self.top.destroy()

#initializing progress bar, may be used with self.top
def init_progbar(self):
self.top = tk.Toplevel(self)
self.top.frame = tk.Frame(self.top)
self.top.frame.grid()
self.top.frame.progbar = ttk.Progressbar(self.top.frame, \
orient='horizontal', mode = 'determinate', length = '500')
self.top.frame.progbar.grid()
Window.center(self.top)

#static method to center a toplevel window
@staticmethod
def center(toplevel, size=None):
toplevel.update_idletasks()
w = toplevel.winfo_screenwidth()
h = toplevel.winfo_screenheight()
if not size:
size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
x = w/2 - size[0]/2
y = h/2 - size[1]/2
toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))

#dummy method - somethings done, then the value of the progress bar
#is raised by 10
def prog_data(self):
for i in range(10):
time.sleep(1)
self.top.frame.progbar.step(10)
self.top.update_idletasks()

def main():
window = Window()
window.mainloop()

if __name__=='__main__':
main()

正如我之前所说,它在 Linux 下运行没有任何问题,只是在 Windows 上不起作用。

我在两个不同的 Linux 系统( openSUSE 和 Ubuntu )和两台不同的运行 Windows 的计算机(一台 Windows 7 和一台 Windows 10)上进行了尝试。每次出现相同的问题时 - Windows 上的进度条丢失。

最佳答案

我自己找到了解决方案。问题是Windows和Linux下的执行似乎有点不同。

在进入上例中的主循环之前,Windows 不会更新 GUI。这件事的处理在Linux上明显不同,保证正确执行。

为了清楚起见,我重新编写了示例代码,因此需要更改的内容可能会变得更清楚。查看评论以获取进一步的解释。

import Tkinter as tk
import ttk
import platform
import time

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.init_progbar()
self.prog_data()
self.top.destroy()

#initializing progress bar, may be used with self.top.
def init_progbar(self):
#The frame here was unnecessary.
self.top = tk.Toplevel(self)
self.top.progbar = ttk.Progressbar(self.top, \
orient='horizontal', mode = 'determinate', length = '500')
self.top.progbar.grid()
Window.center(self.top)

#static method to center a toplevel window
@staticmethod
def center(toplevel, size=None):
toplevel.update_idletasks()
w = toplevel.winfo_screenwidth()
h = toplevel.winfo_screenheight()
if not size:
size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
x = w/2 - size[0]/2
y = h/2 - size[1]/2
toplevel.geometry("%dx%d+%d+%d" % (size + (x, y)))
#This processes every pending geometry change and redraws the widget.
self.update()

#dummy method - somethings done, then the value of the progress bar
#is raised by 10
def prog_data(self):
for i in range(10):
time.sleep(1)
self.top.frame.progbar.step(10)
#Updates the whole GUI every time some data gets processed.
self.update()

def main():
window = Window()
window.mainloop()

if __name__=='__main__':
main()

关于python - Tkinter 进度条在 Windows 下不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32965243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com