2013-03-22 2 views
0

Я новичок в этом графическом бизнесе с python2.7 и Tkinter. Я пытаюсь создать новый кадр в зависимости от того, какой Radiobutton пользователь выбирает, как меню. Когда я нажимаю на радиатор, он создает новый кадр, как я хочу, но если я продолжаю нажимать на тот же самый радиобуй, он создаст еще один кадр, другой кадр и т. Д. Не может показаться, что нужно выяснить, как проверить если Radiobutton уже отмечен (щелкнул только один раз).Tkinter Radiobutton порождает рамки

Надеюсь, я прояснился, благодарен за помощь!

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... 
+1

Радиоуправления не предназначены для такого рода использования. Они предназначены для выбора, а не для выполнения действий. Я подозреваю, что ваши пользователи будут удивлены, когда они сделают выбор, и появится окно. –

+1

Хорошо, спасибо. Просто хотел сделать программу «гладкой». Я пропущу его и внедрив вместо этого кнопку «Отправить». – telnetmaster

ответ

0

Ну, если вам нужен только один кадр, чтобы быть открытым в то время, вы можете вызвать frame.destroy() на предыдущем кадре, прежде чем создать экземпляр нового кадра. Однако для этого подхода потребуется, чтобы в Tkinter было что-то инициализированное до destroy при первом выборе одной из кнопок, иначе вы получите сообщение об ошибке. Для моей цели я просто создал класс throwaway с методом destroy, который ничего не сделал, а затем использовал экземпляр этого класса в качестве заполнителя, связанного с этой переменной, до тех пор, пока мой виджет Toplevel не будет создан впервые. Если вы хотите открыть несколько кадров одновременно, просто не дублируя одну и ту же опцию, попробуйте использовать другое имя переменной для каждого фрейма и создавайте только фрейм if not frame.winfo_exists() - хотя я не уверен на 100%, что это не будет восприимчиво к той же проблеме, когда требуется местозаполнитель, назначенный этой переменной, до тех пор, пока кадр не будет создан в первый раз. Если это необходимо, классу-заполнителю понадобится метод winfo_exists(), который будет return False.

Смежные вопросы