私は次の問題を抱えています。TkinterでGUIを作成し、IDE(Spyder)で実行するとすべてが正常に機能しますが、ファイルを名前を付けて保存し、.pyを実行するだけで開始したい場合は、ウィンドウが作成されるかダイアログが開くたびに、2番目のTkinterウィンドウがポップアップしています。コードを.pywとして保存すると、同じ問題が発生します。同じ問題が続く短い例を投稿しました。
import tkinter as tk
from tkinter import messagebox
class test_GUI(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self._initializeWindow()
self._window.protocol("WM_DELETE_WINDOW", self.__on_closing)
self._window.mainloop()
def _initializeWindow(self):
self._window=tk.Tk()
self._window.title("The window I initzialized")
def __on_closing(self):
if(messagebox.askokcancel("Quit", "Quit program?")):
self._window.destroy()
self._window.quit()
app=test_GUI()
クラスを次のように定義します
class test_GUI(tk.Frame):
したがって、クラスはから継承しtk.Frame
ます。つまり、クラスは基本的に追加機能を備えたフレームです。
あなたがするとき
super().__init__(master)
継承元のクラスであるを初期化しますtk.Frame
。現時点では、tk.Tk
オブジェクト(およびmaster=None
)はありません。フレーム(または他のtkinterウィジェット)はのインスタンスなしでは存在できないためtk.Tk
、tkinterはサイレントにインスタンスを作成します。これが最初のウィンドウです。
その後、あなたは電話します
self._window = tk.Tk()
tk.Tk
自分でインスタンスを作成します。これは2番目のウィンドウです。2つのウィンドウが必要ないことに加えてtk.Tk
、予期しない動作が発生するため、複数のインスタンス(より正確には関連するTclインタープリター)を同時に実行しないでください。
では、どうすればこれを修正できますか?
基本的に2つのオプションがあります。継承を削除するかtk.Tk
、クラスを開始する前に開始します。
継承がなければ、アプリは次のように構成できます
import tkinter as tk
class test_GUI():
def __init__(self):
self._window=tk.Tk()
self._window.title("The window I initzialized")
self.button = tk.Button(self._window, text='Test button')
self.button.pack()
...
self._window.mainloop()
継承を使用すると、このように行うことができます
import tkinter as tk
class test_GUI(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title("The window I initzialized")
self.button = tk.Button(self, text='Test button')
self.button.pack()
root = tk.Tk()
app=test_GUI(root)
app.pack(fill='both', expand=True)
root.mainloop()
どちらの方法でも問題なく動作します。個人的には継承のあるバージョンが好きです。tkinterアプリケーションの構築に関するBryanOakleyの投稿もここでチェックしてください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加