Python 2.7 Tkinter将变量返回到main

Python 2.7 Tkinter将变量返回到main,python-2.7,tkinter,Python 2.7,Tkinter,嗨,我有一个程序,运行方式如下。当用户输入一个介于1-10之间的数字并点击GO按钮时,左、中、右三个复选框出现。选中仅1个复选框后,将显示一个按钮。选择1后,我禁用其他选项。我想返回选中复选框的主程序。我该怎么做呢。我可以通过“下一步”按钮或复选框进行选择。我的代码在下面 import Tkinter as Tk import ctypes def setup_fc_error_message(): lines = ['fc is out of range: Please Enter

嗨,我有一个程序,运行方式如下。当用户输入一个介于1-10之间的数字并点击GO按钮时,左、中、右三个复选框出现。选中仅1个复选框后,将显示一个按钮。选择1后,我禁用其他选项。我想返回选中复选框的主程序。我该怎么做呢。我可以通过“下一步”按钮或复选框进行选择。我的代码在下面

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()

我清理了你的MainWindow类,删除了cdb、crb、cld函数,所以你只需要为每个调用的\u切换设置一个函数,以提高效率。您还将注意到add_checkbox函数中的一些细微变化,它使用lambda传递特定checkbutton的值。由于我组合了这些函数,我对var_states函数也做了同样的处理

我把Tk.IntVar放在那里了,因为你可能需要它们。虽然我不知道你想用它们来做什么,但我想用它来做一个选择按钮

至于你的问题,你已经有了一个方法来找出哪个复选框被选中了,所以我不完全确定你想要什么,但我已经概述了你可以在哪里检查它们

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

如果只应选择一个按钮,则使用单选按钮。将变量选项与Intvar或Stringvar一起使用,可以从程序中的任何位置访问结果。请参阅《谢谢你的帮助》第52节。我会试试看。我正在将带有用户输入的python脚本转换为gui。要做到这一点,我只需将所有函数复制到类主窗口:?或多或少地稍加修改,这取决于您希望如何设置它。您还可以使用其他类来帮助组织程序的不同方面。我尝试了代码,但它似乎只在我选中最后一个复选框时才启用“下一步”按钮。如果我点击左键和中键,它不会禁用其他两个复选框。如果我使用单选按钮,这可能会更容易些?