1

私は 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()
4

3 に答える 3

1

これは古い質問であることは知っていますが、同様の状況を経験し、解決策を見つけました。

私の場合、問題を の使用に切り分けましたiconbitmap。呼び出す直前にメソッドでiconbitmap呼び出すことで解決できました。 afterroot.mainloop()

例:

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() ウィンドウでも機能します。

Python 3.5.0 を使用した Win 8.1 でテスト済み。

編集:さらに調べたところ、root.geometryの存在に関連して動作が変化することに気付きました。私の最初の例にはそれがありませんでした.数回試した後、まだ同じ問題があることに気付きました. メソッドの時間遅延はafter何も変わらないようです。

メソッドのroot.geometry下に移動すると、何らかの理由で同じ問題が発生します。after

于 2015-10-23T18:47:54.527 に答える
0

おそらく、初期化コードのどこかでupdateまたはupdate_idletasksを呼び出しているため、GUI の現在の状態が画面に描画されます。

問題の別の考えられる原因は、Tkではなくの複数のインスタンスを作成している場合ですToplevel

ただし、コードを見なくても、推測するしかありません。

この問題を解決する最善の方法は、同じ動作をする小さな例を作成することです。あなたを助けるためにそれが必要だからではなく、バグを再現しようとするあなたの努力がバグの原因を教えてくれるでしょう。

于 2013-09-12T17:34:13.463 に答える