2015-10-23 5 views
0

Привет У меня есть программа, которая работает следующим образом. Когда пользователь вводит число от 1 до 10 и нажимает кнопку GO, появляются 3 чекбокса Left, Middle и Right. При выборе только 1 флажка появляется кнопка «Далее». Я отключу остальные после выбора 1. Я хотел бы вернуться к основной программе, которая была выбрана. Как мне это сделать. Я могу сделать это с помощью кнопки «Далее» или с помощью выбора флажка. Мой код нижеTkinter возвращает переменную main

import Tkinter as Tk 
import ctypes 


def setup_fc_error_message(): 
    lines = ['fc is out of range: Please Enter a value from 1-10:'] 
    MessageBox = ctypes.windll.user32.MessageBoxA 
    MessageBox(None, "\n".join(lines), 'Setup Info', 0) 

def check_fc_range(fc_user): 
    # fc_float = si_units(fc_string_input) 
# fc_float = float(fc_string_input) 
    fc_string_user = str(fc_user) 
    if (fc_user)>=1 and (fc_user<=10): 
     return (float(fc_user),fc_string_user) 
    else: 
     setup_fc_error_message() 
     return check_fc_range() 


class MainWindow(Tk.Frame): 

    def __init__(self, parent): 
     Tk.Frame.__init__(self,parent) 
     self.parent = parent 
     self.parent.title('Test') 
     self.initialize() 


    def var_states_d(self): 
     return self.dvar 

    def var_states_r(self): 
     return self.rvar 

    def var_states_l(self): 
     return self.lvar 


    def cdb(self): 
#  print "variable is", self.dvar.get() 
     self.dvar_state = self.dvar.get() 
#  self.band_type = StringVar() 
#  self.band_type.set('D') 

     if self.dvar_state: 
      self.cr = Tk.Checkbutton(self.parent, text='Middle', state='disable', variable=self.rvar,command = self.crb) 
      self.cr.grid(row = 2, column = 1) 

      self.cl = Tk.Checkbutton(self.parent, text='Right', state='disable', variable=self.lvar,command = self.clb) 
      self.cl.grid(row = 2, column = 2) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', command= self.var_states_d) 
      self.nextbutton.grid(row=2,column=3) 

     else: 
      self.cr = Tk.Checkbutton(self.parent, text='Middle', variable=self.rvar,command = self.crb) 
      self.cr.grid(row = 2, column = 1) 

      self.cl = Tk.Checkbutton(self.parent, text='Right', variable=self.lvar,command = self.clb) 
      self.cl.grid(row = 2, column = 2) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', state='disable') 
      self.nextbutton.grid(row=2,column=3) 




    def crb(self): 
#  print "variable is", self.rvar.get() 

     self.rvar_state = self.rvar.get() 
#  self.band_type = StringVar() 
#  self.band_type.set('R') 

     if self.rvar_state: 
      self.cd = Tk.Checkbutton(self.parent, text='Left', state='disable', variable=self.dvar,command = self.cdb) 
      self.cd.grid(row = 2, column = 0) 

      self.cl = Tk.Checkbutton(self.parent, text='Right', state='disable', variable=self.lvar,command = self.clb) 
      self.cl.grid(row = 2, column = 2) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', command= self.var_states_r) 
      self.nextbutton.grid(row=2,column=3) 
     else: 
      self.cd = Tk.Checkbutton(self.parent, text='Left', variable=self.dvar,command = self.cdb) 
      self.cd.grid(row = 2, column = 0) 

      self.cl = Tk.Checkbutton(self.parent, text='Right', variable=self.lvar,command = self.clb) 
      self.cl.grid(row = 2, column = 2) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', state='disable') 
      self.nextbutton.grid(row=2,column=3) 

    def clb(self): 
#  print "variable is", self.lvar.get() 

     self.lvar_state = self.lvar.get() 
#  self.band_type = StringVar() 
#  self.band_type.set('L') 

     if self.lvar_state: 
      self.cd = Tk.Checkbutton(self.parent, text='Left', state='disable', variable=self.dvar,command = self.cdb) 
      self.cd.grid(row = 2, column = 0) 

      self.cr = Tk.Checkbutton(self.parent, text='Middle', state='disable', variable=self.rvar,command = self.crb) 
      self.cr.grid(row = 2, column = 1) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', command= self.var_states_l) 
      self.nextbutton.grid(row=2,column=3) 

     else: 
      self.cd = Tk.Checkbutton(self.parent, text='Left', variable=self.dvar,command = self.cdb) 
      self.cd.grid(row = 2, column = 0) 

      self.cr = Tk.Checkbutton(self.parent, text='Middle', variable=self.rvar,command = self.crb) 
      self.cr.grid(row = 2, column = 1) 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', state='disable') 
      self.nextbutton.grid(row=2,column=3) 







    def initialize(self): 
     # self.frame = Tk.Frame(parent) 
     # self.frame.pack() 

     self.fc_gui = Tk.DoubleVar(self.parent) 

     self.fclabel1 = Tk.Label(self.parent, text = 'Please Enter a value between 1 and 10', fg = 'black', bg = 'yellow') 
     self.fclabel1.grid(row = 0, column = 0) 

     self.fcedit1 = Tk.Entry(self.parent, textvariable = self.fc_gui, bd = 5 ) 
     self.fcedit1.grid(row = 1, column = 0) 

     self.fcbutton1 = Tk.Button(self.parent, text='GO', command = self.get_fc) 
     self.fcbutton1.grid(row = 1, column = 1) 


    def add_checkbox(self): 

     self.dvar = Tk.IntVar() 

     self.cd = Tk.Checkbutton(self.parent, text='Left', variable=self.dvar,command = self.cdb) 
     self.cd.grid(row = 2, column = 0) 


     self.rvar = Tk.IntVar() 

     self.cr = Tk.Checkbutton(self.parent, text='Middle', variable=self.rvar,command = self.crb) 
     self.cr.grid(row = 2, column = 1) 

     self.lvar = Tk.IntVar() 

     self.cl = Tk.Checkbutton(self.parent, text='Right', variable=self.lvar,command = self.clb) 
     self.cl.grid(row = 2, column = 2) 



    def get_fc(self): 

     self.fc_user = self.fc_gui.get() 
     if self.fc_user: 
      if check_fc_range(self.fc_user): 
       self.add_checkbox() 
      return self.fc_user 
######################################################GUI portion ############################################## 

def main(): 

    root = Tk.Tk() 
    app = MainWindow(root) 
    fc_gui_user = app.get_fc() 

    app.mainloop() 


if __name__ == "__main__": 
    main() 
+0

Если выбрана только одна кнопка, используйте Radiobuttons. Используйте параметр переменной с Intvar или Stringvar для доступа к результатам из любой точки программы. См. Раздел 52 http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html –

ответ

0

Я очистил свой класс MainWindow удаления CDB, CRB, функции CLD поэтому вам нужно только один для каждого называется on_toggle, чтобы сделать его более эффективным. Вы также заметите некоторые незначительные изменения в функции add_checkbox, используя lambda, чтобы передать значение для этой конкретной кнопки. И поскольку я объединил функции, я сделал то же самое для функции var_state.

Я оставил Tk.IntVar там, возможно, вы, возможно, нуждались в них. Хотя я не уверен, что вы хотите использовать их с помощью Checkbutton.

Что касается вашего вопроса, у вас уже был способ определения того, какой флажок был выбран, поэтому я не совсем уверен, что вам нужно, но я изложил, где вы можете их проверить.

class MainWindow(Tk.Frame): 
    def __init__(self, parent): 
     Tk.Frame.__init__(self,parent) 
     self.parent = parent 
     self.parent.title('Test') 
     self.initialize() 
     self.chk_buttons = [] # List holding each checkbutton 
     self.var_states = [] # List holding each Invar for checkbutton 
     self.clicked = False # Variable to know if a checkbutton is currently selected 

    def get_var_states(self, i): 
     # Return IntVar of clicked checkbutton 
     return self.var_states[i] 

    def on_toggle(self, pos): 
#  print "variable is", self.dvar.get() 
     self.dvar_state = self.dvar.get() 
#  self.band_type = StringVar() 
#  self.band_type.set('D') 

     if not self.clicked: 
      # Changes all except clicked checkbox to disabled 
      # Altering state of existing widget 
      for i, chk_btn in enumerate(self.chk_buttons): 
       if i != pos: 
        chk_btn.configure(state='disable') 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', command=lambda: self.get_var_states(pos)) 
      self.nextbutton.grid(row=2,column=3) 

     # You can use these if statements to do something if a certain checkbutton is clicked 
     # Alternately you can call self.get_var_states(pos) here, instead of adding the command 
     # to the Next button so it runs when a checkbutton is clicked instead of when the Next button is clicked 
      if pos == 0: # Left 
       pass 

      if pos == 1: # Middle 
       pass 

      if pos == 2: # Right 
       pass 

     else: 
      # Changes all checkbox to normal 
      for chk_btn in self.chk_buttons: 
       chk_btn.configure(state='normal') 

      self.nextbutton = Tk.Button(self.parent, text='NEXT', state='disable') 
      self.nextbutton.grid(row=2,column=3) 

     self.clicked = not self.clicked #Changes between True and False with each click 


    def initialize(self): 
     # self.frame = Tk.Frame(parent) 
     # self.frame.pack() 

     self.fc_gui = Tk.DoubleVar(self.parent) 

     self.fclabel1 = Tk.Label(self.parent, text = 'Please Enter a value between 1 and 10', fg = 'black', bg = 'yellow') 
     self.fclabel1.grid(row = 0, column = 0) 

     self.fcedit1 = Tk.Entry(self.parent, textvariable = self.fc_gui, bd = 5 ) 
     self.fcedit1.grid(row = 1, column = 0) 

     self.fcbutton1 = Tk.Button(self.parent, text='GO', command = self.get_fc) 
     self.fcbutton1.grid(row = 1, column = 1) 


    def add_checkbox(self): 
     # Added lambda function passing in a value corresponding to the index position in the list 
     self.dvar = Tk.IntVar() 

     self.cd = Tk.Checkbutton(self.parent, text='Left', variable=self.dvar,command = lambda: self.on_toggle(0)) 
     self.cd.grid(row = 2, column = 0) 

     self.rvar = Tk.IntVar() 

     self.cr = Tk.Checkbutton(self.parent, text='Middle', variable=self.rvar,command = lambda: self.on_toggle(1)) 
     self.cr.grid(row = 2, column = 1) 

     self.lvar = Tk.IntVar() 

     self.cl = Tk.Checkbutton(self.parent, text='Right', variable=self.lvar,command = lambda: self.on_toggle(2)) 
     self.cl.grid(row = 2, column = 2) 

     self.chk_buttons = [self.cd, self.cr, self.cl] # List of checkboxes 
     self.var_states = [self.dvar, self.rvar, self.lvar] # List corresponding InvVar 

    def get_fc(self): 

     self.fc_user = self.fc_gui.get() 
     if self.fc_user: 
      if check_fc_range(self.fc_user): 
       self.add_checkbox() 
      return self.fc_user 
+0

Спасибо за помощь. Я это попробую. Я конвертирую скрипт python с пользовательским вводом в gui. Для этого просто скопируйте все мои функции в класс MainWindow():? – Lefti

+0

Более или менее с небольшим мастером, все зависит от того, как вы хотите установить его. У вас могут быть и другие классы, чтобы помочь организовать различные аспекты вашей программы. –

+0

Я пробовал код, но кажется, что он только активирует кнопку «Далее», когда я проверяю последний флажок (справа). Если я нажму «Левый» и «Средний», он не отключит два других флажка. Может быть, это проще, если я использую радиатор? – Lefti

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