【问题标题】:Python Tkinter Sequential Forms Passing ParametersPython Tkinter 顺序形式传递参数
【发布时间】:2019-12-21 23:21:46
【问题描述】:

我是 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)

【问题讨论】:

标签: python tkinter parameter-passing


【解决方案1】:

感谢那些花时间发布 cmets 的人。经过更多的研究,我重新编写了程序。现在可以了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多