Python 2.7 Tkinter将变量返回到main
嗨,我有一个程序,运行方式如下。当用户输入一个介于1-10之间的数字并点击GO按钮时,左、中、右三个复选框出现。选中仅1个复选框后,将显示一个按钮。选择1后,我禁用其他选项。我想返回选中复选框的主程序。我该怎么做呢。我可以通过“下一步”按钮或复选框进行选择。我的代码在下面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
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。要做到这一点,我只需将所有函数复制到类主窗口:?或多或少地稍加修改,这取决于您希望如何设置它。您还可以使用其他类来帮助组织程序的不同方面。我尝试了代码,但它似乎只在我选中最后一个复选框时才启用“下一步”按钮。如果我点击左键和中键,它不会禁用其他两个复选框。如果我使用单选按钮,这可能会更容易些?