首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python闪烁标准窗口

Python闪烁标准窗口
EN

Stack Overflow用户
提问于 2013-09-12 16:10:52
回答 3查看 3.5K关注 0票数 1

我正在用TKinter构建一个接口,我有一个问题:每当创建一个新窗口时,标准的200x200像素的tkinter窗口就会闪烁一小部分秒,然后我所有的修改(小部件等等)都会闪烁起来。都是制造出来的。在调用This循环之前和之后都会发生这种情况。

  • 主界面被创建。
  • 主回路统计
  • 闪烁窗
  • 主界面出现

同样,在Mainloop被调用之后,这也会发生在新创建的窗口中。

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

可惜我不能给你一个代码样本..。如果我试着做一个最小的例子,这种情况就不会发生。也许标准窗口被创建了,但是它的变化太快了,以至于它不会出现在屏幕上。我甚至不知道在这个案子里该查什么.搜索"tkinter闪烁窗口“不会产生任何结果。

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

下面是我使用的图标的代码示例和链接,但我想任何图标都可以。

代码语言:javascript
运行
复制
# 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()
EN

回答 3

Stack Overflow用户

发布于 2015-10-23 18:47:54

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

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

示例:

代码语言:javascript
运行
复制
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()窗口。

用Python3.5.0在Win 8.1上进行测试。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-12 17:34:13

最有可能的是,在初始化代码中调用updateupdate_idletasks,这会在屏幕上绘制GUI的当前状态。

问题的另一个可能来源是,如果要创建多个Tk实例,而不是Toplevel实例。

但是,没有看到您的代码,我们所能做的就是猜测。

解决这个问题的最好方法是创建一个具有相同行为的小示例。这并不是因为我们需要它来帮助您,而是因为您在重新创建bug方面所付出的努力可能会告诉您是什么导致了错误。

票数 0
EN

Stack Overflow用户

发布于 2016-02-14 12:39:37

这应该可以工作,但它需要win32gui

代码语言:javascript
运行
复制
import win32gui

def FlashMyWindow(title):
    ID = win32gui.FindWindow(None, title)
    win32gui.FlashWindow(ID,True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18769336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档