私は TKinter を使用してインターフェイスを構築していますが、新しいウィンドウを作成するたびに、何も入っていない 200x200 ピクセルの標準化された tkinter ウィンドウがほんの一瞬点滅し、その後、すべての変更 (ウィジェットなど) が表示されるという問題があります。作る。これは、メインループを呼び出す前と後に発生します。
- Main-Interface が作成されます。
- メインループ統計
- 点滅するウィンドウ
- メインインターフェイスが表示されます
また、メインループが呼び出された後、これは新しく作成されたウィンドウで発生します。
- メインインターフェイスが表示されます->ボタンを押すと、新しいウィンドウが作成されます
- 点滅するウィンドウ
- 新しいウィンドウが表示されます
残念ながら、サンプル コードを提供することはできません...最小限の例を実行しようとすると、これは起こりません。おそらく、標準ウィンドウが作成されますが、あまりにも速く変更されるため、画面に表示されません。この場合、何を検索すればよいかさえわかりません...「tkinter flashing window」を検索しても何も得られません。
編集:問題の原因を見つけました。wm_iconbitmap
、 、FigureCanvasTkAgg
が原因のようtkinter.Toplevel
です。コードからアイコンを削除すると、正常に動作し、点滅しなくなります。しかし、他のものと一緒に使用すると、作成時にウィンドウが点滅します。以下のコードで試してみてください。もちろん、アイコンを作業ディレクトリに配置する必要があります。
ここにコード サンプルと私が使用しているアイコンへのリンクがありますが、どのアイコンでもよいと思います。
# 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()