0

私はpython2.7とTkinterを使ったこのGUIビジネスに不慣れです。メニューのように、ユーザーが選択したラジオボタンに応じて新しいフレームを作成しようとしています。ラジオボタンをクリックすると、希望どおりに新しいフレームが作成されますが、同じラジオボタンをクリックし続けると、別のフレームが作成され、別のフレームなどが作成されます。確認方法がわかりませんラジオボタンがすでにマークされている場合 (1 回だけクリック)。

助けてくれてありがとう!

class Books:
    """ Books() is the main class for creating the whole interface """
    def __init__(self):
    """ Initialize the first function in class Books() """

        self.library = "library.txt"
        self.filepath = os.getcwd() + "/" + self.library

        self.window = Tk()

        self.window.title("Personal library")
        self.window.wm_iconbitmap(default="myicon.ico")

        userChoice = Frame(self.window, height = 1, bd = 1, relief = RIDGE)
        userChoice.pack(side = TOP, pady = 10, padx = 5)

        self.menuChoice = IntVar()

        btAddBooks = Radiobutton(userChoice, text = "Add a new book to the library", value = 1, variable = self.menuChoice, command = self.processChoice)
        btAddBooks.grid(row = 1, sticky = W)

        btFindBooks = Radiobutton(userChoice, text = "Print info about a book", value = 2, variable = self.menuChoice, command = self.processChoice)
        btFindBooks.grid(row = 2, sticky = W)

        btPrintBooks = Radiobutton(userChoice, text = "Print all book titles in library", value = 3, variable = self.menuChoice, command = self.processChoice)
        btPrintBooks.grid(row = 3, sticky = W


    def processChoice(self):
        """ Used to handle user choice of Radiobuttons """
        if self.menuChoice.get() == 1:
            self.processAddBooks()
        elif self.menuChoice.get() == 2:
            self.processFindBook()
        elif self.menuChoice.get() == 3:
            self.processShowBooks(self.filepath)


    def processAddBooks(self):
        """ Add a new book to the library. """
        # Create a new frame
        questions = Frame(self.window, height = 1, bd = 1, relief = SUNKEN)
        questions.pack(fill = X, pady = 10, padx = 5)

        # Do stuff with frame here...
4

1 に答える 1

0

一度に 1 つのフレームだけを開く必要がある場合はframe.destroy()、新しいフレームをインスタンス化する前に前のフレームを呼び出すことができます。ただし、このアプローチでは、ボタンの 1 つが最初に選択されたときに Tkinter 用に初期化されたものが必要ですdestroy。そうしないと、エラーが発生します。私の目的のために、destroy何もしないメソッドで使い捨てクラスを作成し、そのクラスのインスタンスをその変数にバインドされたプレースホルダーとして使用して、トップレベル ウィジェットを初めて作成しました。複数のフレームを同時に開きたい場合は、同じオプションの重複ではなく、フレームごとに異なる変数名を使用して、フレームのみを作成してみてください。if not frame.winfo_exists()--フレームが初めて作成されるまで、その変数にプレースホルダーを割り当てる必要があるという同じ問題の影響を受けないかどうかは100%確信が持てません。そのようなものが必要な場合、プレースホルダー クラスには次のようなwinfo_exists()メソッドが必要になりreturn Falseます。

于 2015-05-16T21:35:20.360 に答える