2

画面上にボタンを作成して配置する関数を作成しようとしましたが (グリッド付き)、ボタンのコマンドはそれ自体 (または他のウィジェット) を削除しますが、そうできませんでした。

def a(self):
    self.call_button = Tkinter.Button(self.root, text = "Call", command=self.b).grid(row = 5, column = 5)

def b(self):
    self.call_button.destroy()

aはボタンを作成し、bはそれを削除しますが、bを呼び出すと、「NoneTypeオブジェクトには属性destroyがありません」と表示されます

これを正しく行うにはどうすればよいですか?

4

2 に答える 2

6

self.call_buttongrid(row=5, column=5)ボタンではなく、結果に設定されます。

from tkinter import *
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.a()

    def a(self):
        self.call_button = Button(self, text = "Call", command=self.b)
        self.call_button.grid(row=5, column=5) # This is fixing your issue

    def b(self):
        self.call_button.destroy()

root = Tk()
app = App(master=root)
app.mainloop()
于 2013-07-16T10:33:26.510 に答える
1

Python では、 を実行するとfoo=a().b()、foo に の値が与えられますb()。そのため、実行するとself.call_button = Button(...).grid(...)、self.call_button には の値が与えられます。.grid(...)これは常にNoneです。

ウィジェットへの参照を保持したい場合は、ウィジェットの作成をウィジェットのレイアウトから分離する必要があります。いずれにせよ、これらは概念的には 2 つの異なるものであるため、これは良い習慣です。私の経験では、レイアウトは開発中に大きく変わる可能性がありますが、使用するウィジェットはそれほど変わりません。それらを分離すると、開発が容易になります。さらに、後で複数のレイアウトを提供することに決めた場合 (例: 左側のナビゲーション、右側のナビゲーションなど) の扉が開かれます。

于 2013-07-16T10:41:52.257 に答える