Python Tkinter 闪烁标准窗口

标签 python tkinter

我正在使用 TKinter 构建一个界面,我遇到了一个问题,每当创建一个新窗口时,200x200 像素的标准化 tkinter 窗口中没有任何内容会闪烁几分之一秒,之后我的所有修改(小部件等) .) 制成。这发生在调用主循环之前和之后。

  • 主界面已创建。
  • 主循环统计
  • 闪烁的窗口
  • 出现主界面

此外,在调用 Mainloop 后,新创建的窗口也会发生这种情况。

  • 出现主界面-->按下按钮,创建一个新窗口
  • 闪烁的窗口
  • 出现新窗口

遗憾的是,我无法为您提供示例代码...如果我尝试做一个最小的示例,则不会发生这种情况。也许标准窗口已创建,但它更改得如此之快,以至于它没有出现在屏幕上。我什至不知道在这种情况下要查找什么...搜索“tkinter flashing window”不会产生任何结果。

编辑:我找到了问题的根源。它似乎是由 wm_iconbitmapFigureCanvasTkAggtkinter.Toplevel 引起的。如果您从代码中删除图标,它工作正常,不会闪烁。但是,如果我将它与另一个一起使用,则创建时窗口会闪烁。使用下面的代码尝试一下。当然,您必须将图标放在工作目录中。

这是一个代码示例和 the link到我正在使用的图标,但我想任何图标都可以。

# coding=utf-8
import numpy as np
import matplotlib as mpl
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import os

class INTERFACE(object):
    def __init__(self):
        self.root = tk.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.EXIT)
        self.root.wm_iconbitmap( os.path.abspath("icon.ico"))  #<---- !!!!!!
        self.root.geometry("1024x768")
        canvas = FigureCanvasTkAgg(self.testfigure(), master=self.root) #<---- !!!!!!
        canvas.get_tk_widget().grid(sticky=tk.N+tk.W+tk.E+tk.S)
        self.root.rowconfigure(0, weight=1)
        self.root.columnconfigure(0, weight=1)
    def testfigure(self):
        x=np.linspace(0, 2*np.pi,100)
        y=np.sin(x)
        fig = mpl.figure.Figure()
        sub = fig.add_subplot(111)
        sub.plot(x,y)
        return fig

    def EXIT(self):
        Top = tk.Toplevel(master=self.root)
        Top.wm_iconbitmap( os.path.abspath("icon.ico"))  #<---- !!!!!!
        Top.transient(self.root)
        Top.resizable(width=False, height=False)
        Top.title("Exit")

        tk.Message(Top,text="Do you really want to quit?", justify=tk.CENTER, width=300).grid(row=0,columnspan=3)
        tk.Button(Top,text="YES",command=self.root.destroy).grid(row=1,column=0)
        tk.Button(Top,text="No",command=self.root.destroy).grid(row=1,column=1)
        tk.Button(Top,text="Maybe",command=self.root.destroy).grid(row=1,column=2)
    def start(self):
        self.root.mainloop()

if __name__ == '__main__':
    INTERFACE().start()

最佳答案

我知道这是一个老问题,但我经历过类似的情况并找到了解决方案。

就我而言,我已将问题与 iconbitmap 的使用隔离开来。我设法通过在调用 root.mainloop() 之前使用 after 方法调用 iconbitmap 来解决这个问题。

示例:

from tkinter import *

    root = Tk()

    w = Label(root, text="Hello, world!")
    w.pack()

    root.geometry('300x300+500+500')
    root.after(50, root.iconbitmap('icon.ico'))
    root.mainloop()

此方法也适用于带有图标的 Toplevel() 窗口。

在 Win 8.1 上使用 Python 3.5.0 进行测试。

编辑:经过进一步检查,我注意到行为也相对于 root.geometry 的存在发生了变化。我最初的示例没有它,经过几次尝试后我才注意到它仍然存在相同的问题。 after 方法中的时间延迟似乎没有改变任何东西。

由于某种原因,将 root.geometry 移动到 after 方法下方会产生相同的问题。

关于Python Tkinter 闪烁标准窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769336/

相关文章:

python - 使用 Kivy 为同一事件添加多个处理程序的最佳/正确方法是什么?

python - 使用 OpenCV 清理文本图像以进行 OCR 阅读

Python3,理解 tkinter-mainloop() 或 QtPy-exec_() 中的 "GUI loop"

python - 调用 glfw.init() 后,BadWindow 在 tkinter 中崩溃

python - super 能达到什么效果

python - Pandas Value_Counts 选择

python - 帮助python继承

python - Tkinter、tkmessagebox 不断将我发送到根目录

python - sqlite3.OperationalError...我的 sqlite 语法有什么问题?

python ,Tkinter : how can I prevent tkinter gui mainloop crash using threading