tkinter로 아이 윈도우를 낼 때, 복수 작성할 수 버리므로 방지하는 방법

13540 단어 TkinterPython3

일의 발단



tkinter로 서브 윈도우를 만들고 있으면, 서브 윈도우 내의 라디오 버튼이 버그되어 버려, 표시한 순간에 2개 선택되고 있는 상태가 되었기 때문에, 원인을 찾아 가는 결과, 이하의 코드와 같이 그렇게 하면, 잘 버그도 나오지 않고 기다렸고, 다른 문제점도 발견할 수 있었습니다.

버그 원인



어쩌면 부모 window의 mainloop()과 자식 window의 mainloop()이 Toplevel에서 부모와 자식을 연결하지 않았기 때문에 의도하지 않은 표시가 되었을 것입니다.

참고



htps : // 코 m / 코지 히로의 @ geu b / ms / df9 a40d3351bfbd0d9
↑ 이 페이지의 코드를 참고로 했습니다. 비 모달로 singleton으로 만드는 것 같습니다.

아래 코드 포인트



부모 윈도우와 아이 윈도우를 Toplevel()로 묶는다만, 버튼의 command로 콜백시킨 경우는 잘 되지만, 그렇지 않은 경우는, 아이 윈도우가 몇개라도 작성할 수 있어 버린다고 하는 차이를 발견 했습니다.

샘플 코드



다음 코드를 복사하면 샘플을 실행할 수 있습니다.
추기) 버그를 발견했기 때문에, this_window_close(self)의 메소드를 추가 수정했습니다.
import tkinter


# 子ウィンドウ
class ChildWindow:
    def __init__(self, parent):
        self.parent = parent
        self.window = None
        self.radio_1 = None
        self.radio_2 = None
        self.radio_3 = None
        self.var = tkinter.IntVar()  # チェック有無変数

    def init(self):
        if not self.window:
            self.window = tkinter.Toplevel(self.parent)

        self.var.set(1)  # value=0のラジオボタンにチェックを入れる
        # ラジオボタン作成
        self.radio_1 = tkinter.Radiobutton(self.window, value=0, variable=self.var, text="幅32")
        self.radio_1.place(x=10, y=10)
        self.radio_2 = tkinter.Radiobutton(self.window, value=1, variable=self.var, text="幅140")
        self.radio_2.place(x=60, y=10)
        self.radio_3 = tkinter.Radiobutton(self.window, value=2, variable=self.var, text="幅200")
        self.radio_3.place(x=110, y=10)

        # ×ボタンの処理をカスタマイズする
        self.window.protocol('WM_DELETE_WINDOW', self.this_window_close)

        self.window.mainloop()

    def this_window_close(self):
        self.window.withdraw()
        # ↓これをしないと、子ウィンドウを閉じた後に、再度開くことが出来なくなる。
        self.window = None
        return "break"


# 親ウィンドウ
class ParentWindow:
    def __init__(self):
        self.root = tkinter.Tk()
        self.sub_root = ChildWindow(self.root)
        self.sub_root_failure = None

        self.root.geometry(str(320) + "x" + str(200) + "+" + str(200) + "+" + str(200))

        self.btn_parent = tkinter.Button(text="何個も作成できてしまうボタン",
                                         command=self.create_new_window)
        self.btn_parent.place(x=10, y=10, width=300, height=25)

        self.btn_child = tkinter.Button(text="一つだけしか作成できないボタン", command=self.sub_root.init)
        self.btn_child.place(x=10, y=50, width=300, height=25)

        self.root.mainloop()

    def create_new_window(self):
        self.sub_root_failure = ChildWindow(self.root)
        self.sub_root_failure.init()
        self.sub_root_failure.window.title("沢山")


def main():
    ParentWindow()


if __name__ == "__main__":
    main()

동작 결과



아래 이미지와 같이 몇 개라도 자식 창을 만들 수 버리는 버튼과 하나 밖에 자식 창을 만들 수없는 버튼이 있습니다.


감상



자신에게는 어째서 이런 차이가 나오는지, 조금 모릅니다만, 결과적으로, 이러한 차이가 나오므로, tkinter로 아이 윈도우를 표시시키는 경우는, 이 문제점에 걸린다고 생각되므로, 마음 를 붙이고 싶습니다.

좋은 웹페이지 즐겨찾기