python - Python Tkinter 顺序形式传递参数
问题描述
我是 Python 编程的新手,对一个问题感到有些困惑。
我正在尝试构建一系列表单并将参数从一个表单传递到下一个表单。虽然我找到了显示如何在表单之间切换的示例,但我还没有找到显示在不同类中的表单之间传递参数的示例。
下面的代码很糟糕并且有错误——对此很抱歉。我认为这对于有经验的 Python 程序员来说是一个相对容易回答的问题。感谢您在这件事上的帮助和考虑。
# Problem 1: All forms open at once instead of 1 at a time
# 2: The buttons are not attached to the forms
# 3: Not sure if parameters are being passed from Form1 to Form2
# 4: Now i am getting errors
# Notes: All forms will be different sizes
import tkinter as tk
class Form1(tk.Tk):
def __init__(self, master):
two=tk.Tk() # <--define object for Form2
value1 = 'Some Text'
value2 = 8
value3 = 'More Text'
#--attempting to pass 3 parameters to Form2
#---on click, open Form2 and close Form1
self.btn=tk.Button(self,text='button 1',
command=Form2.__init__(two, value1, value2, value3))
self.btn.grid(row=0,column=0)
class Form2(tk.Tk):
def __init__(self, parm1, parm2, parm3):
print(parm1, parm2, parm3)
three=tk.Tk() # <--define object for Form3
#---on click, open Form3 form and close Form2
self.btn=tk.Button(self,text='button 2', command=Form3.__init__(three))
self.btn.grid(row=0,column=0)
class Form3(tk.Tk):
def __init__(self):
three = tk.Tk()
self.btn=tk.Button(self,text='button3 ',command=None) # action to be added later
self.btn.grid(row=0,column=0)
a=tk.Tk()
Form1 = Form1(a)
解决方案
感谢那些花时间发表评论的人。经过更多的研究,我重新编写了程序。现在可以了。
# Working Example of how to pass parameters to sequential windows
import tkinter as tk
class Win1(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.grid()
rownum = 0
colnum = 0
#-----collect some information needed for the application--------------------------
self.lbl_a = tk.Label(self, text="Number of Categories", font=("Arial Bold", 10),
justify="left",anchor='w')
self.lbl_a.grid(column=colnum, row=rownum,columnspan=1,sticky='w')
self.numcat_ent =tk.Entry(self, width=12,background='white',
fg='blue',state='normal',font=("Arial Bold", 10), justify='center')
self.numcat_ent.insert('end', '4')
self.numcat_ent.grid(column=colnum+1, row=rownum)
numcat=int(self.numcat_ent.get())
rownum += 1
self.lbl_b = tk.Label(self, text="Items Per Category", font=("Arial Bold", 10),
justify="left",anchor='w')
self.lbl_b.grid(column=colnum, row=rownum,columnspan=1,sticky='w')
items=6
self.numitems_ent=tk.Entry(self, width=12,background='white',
fg='blue',state='normal',font=("Arial Bold", 10), justify='center')
self.numitems_ent.insert('end', '4')
self.numitems_ent.grid(column=colnum+1, row=rownum)
numitems=int(self.numitems_ent.get())
rownum += 1
#---on click, open Win2 and close Win1
btn1=tk.Button(self,text='Show Win 2',
command=lambda: self.open_win2(master,numcat ,numitems))
btn1.grid(row=rownum,column=colnum,sticky='nsew')
def open_win2(self, master, numcat ,numitems):
self.hide(master)
self.root2 = tk.Toplevel()
self.root2.geometry('300x600')
print(numcat,numitems)
app2 = Win2(self.root2,root, numcat, numitems)
def hide(self,master):
root.withdraw()
#---to bring root window back
#root.deiconify()
class Win2(tk.Frame):
def __init__(self, master, root2, parm1, parm2):
tk.Frame.__init__(self, master)
print(parm1, parm2)
root.withdraw()
self.grid()
#---on click, open Win3 form and close Win2
self.btn1=tk.Button(self,text='Open Win3', command=lambda: self.open_win3(master))
self.btn1.grid(row=0,column=0)
rownum = 0
colnum = 0
fontSize = 12
for i in range(parm1):
rownum += 1
self.catEntry=tk.Entry(self, width=12,background='white',
fg='blue',state='normal',font=("Arial Bold", fontSize), justify='center')
self.catEntry.grid(column=colnum, row=rownum)
for j in range(parm2):
rownum += 1
self.subcatEntry=tk.Entry(self, width=12,background='white',
fg='black',state='normal',font=("Arial Bold", fontSize), justify='center')
self.subcatEntry.grid(column=colnum+1, row=rownum)
def open_win3(self,master):
self.hide(master)
root3 = tk.Toplevel()
root3.geometry('800x800')
app3 = Win3(root3)
def hide(self,master):
root.withdraw()
master.withdraw()
class Win3(tk.Frame):
def __init__(self,master):
root.withdraw()
tk.Frame.__init__(self, master)
self.grid()
self.btn=tk.Button(self,text='Return to Start Page',command=lambda:self.return_to_start(master))
self.btn.grid(row=0,column=0)
def return_to_start(self, master):
master.withdraw()
root.deiconify()
root = tk.Tk()
root.geometry("225x100")
app = Win1(root)
#----Mainloop keeps forms updated and listens for user input--
root.mainloop()
推荐阅读
- c - 在 GTK 中使用多线程?
- amazon-web-services - 使用 Amazon API Gateway 和 CloudFront 缩短响应时间
- r - 在ggplot2中的特定位置放置背景图像并进行测量
- google-cloud-platform - GCE on Container + CloudSQL
- html - 视频播放完毕自动返回页面
- html - svg 打破位置:粘在移动浏览器上
- javascript - 如何将material-ui按钮样式应用于html-native按钮
- javascript - Array.filter 是否制作了数组的克隆(副本)?
- mysql - 如何将 React Native 与 mySQL 集成
- r - 查找下一个较小和下一个较大的值