首页 > 解决方案 > 在应用程序中添加新的 tkinter 模块以及从它们调用条目的能力

问题描述

以下是关于作为 mySQL 数据库接口的 python3 tkinter GUI 的参考。

我想知道是否可以通过按钮在应用程序内添加其他标签和条目。

以下是我的代码:

class Application(tk.Frame):
def __init__(self, master=None,x=None):
    super().__init__(master)
    self.master = master
    self.pack()
    self.create_widgets()
    self.xy=x
def create_widgets(self):
    self.label1=tk.Label(self, text="Athlete")
    self.label1.grid(row=2)
    self.Athlete=tk.Entry(self)
    self.Athlete.grid(row=2, column=1)
    self.button1=tk.Button(self,text='Commit')
    self.button1['command']=self.Commit
    self.button1.grid(row=3,column=0,columnspan=2)
    self.label2=tk.Label(self,text="Program")
    self.label2.grid(row=4,column=5)
    self.Exercise=tk.Label(self,text="Exercise")
    self.Exercise.grid(row=5,column=2)
    self.Weight=tk.Label(self,text="Weight")
    self.Weight.grid(row=5,column=3)
    self.Sets=tk.Label(self,text="Sets")
    self.Sets.grid(row=5,column=4)
    self.Reps=tk.Label(self,text="Reps")
    self.Reps.grid(row=5,column=5)
    self.label4=tk.Label(self, text="Exercise 1")
    self.label4.grid(row=7,column=1)
    self.entry1=tk.Entry(self)
    self.entry1.grid(row=7,column=2)
    self.Weight1=tk.Entry(self)
    self.Weight1.grid(row=7,column=3)
    self.Sets1=tk.Entry(self)
    self.Sets1.grid(row=7,column=4)
    self.Reps1=tk.Entry(self)
    self.Reps1.grid(row=7,column=5)
def Commit(self):
    Weight=int(self.Weight1.get())
    Sets=int(self.Sets1.get())
    Reps=int(self.Reps1.get())
    Volume=(Weight*Sets*Reps)
    print(Weight, Sets, Reps, Volume)
root=tk.Tk()
app=Application(master=root)
app.mainloop()

我想要的是另一个按钮,它将用相同的标签和条目填充下一行,允许用户自定义他们正在输入的练习数量。

接下来,我需要一种方法来为 .get() 函数调用这些新条目。不理想的是:a)对输入字段的数量进行硬编码 b)只有一个输入字段

这个想法是用户可以输入任意数量的练习,使用“提交”按钮,它会将其发送到 mySQL 数据库。

任何其他额外的反馈表示赞赏。

谢谢

标签: python-3.xuser-interfacetkinter

解决方案


在我的示例中,我在方法中创建了所有常见的 GUI 元素create_top()

为了跟踪练习号 = 网格行,我创建了变量self.exercise_number。然后我在create_widgets().

由于在按下提交后我不需要访问这些小部件,因此我重新使用了对每个小部件的引用。

Commit()当我按下提交按钮时它处理的每一行。

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None, x=None):
        super().__init__()
        self.master = master
        self.pack(padx=10, pady=10) # Added padding
        self.exercise_number = 0    # Keeping track of grid row
        self.create_top()
        self.create_widgets()

    def create_top(self):
        # Create common GUI elements
        tk.Label(self, text="Athlete").grid(row=2)
        self.Athlete = tk.Entry(self)
        self.Athlete.grid(row=2, column=1)
        self.button1 = tk.Button(self, text='Commit')
        self.button1['command'] = self.Commit
        self.button1.grid(row=3, column=0, columnspan=2)
        tk.Label(self,text="Program").grid(row=4, column=5)
        tk.Label(self,text="Exercise").grid(row=5, column=2)
        tk.Label(self,text="Weight").grid(row=5, column=3)
        tk.Label(self,text="Sets").grid(row=5, column=4)
        tk.Label(self,text="Reps").grid(row=5, column=5)

    def create_widgets(self):
        # Create new line of input fields
        self.exercise_number += 1
        row = 6 + self.exercise_number  # Calculate where to grid entrys
        self.label4 = tk.Label(self, text=f"Exercise {self.exercise_number}")
        self.label4.grid(row=row, column=1)
        self.Exercise = tk.Entry(self)
        self.Exercise.grid(row=row, column=2)
        self.Weight = tk.Entry(self)
        self.Weight.grid(row=row, column=3)
        self.Sets = tk.Entry(self)
        self.Sets.grid(row=row, column=4)
        self.Reps = tk.Entry(self)
        self.Reps.grid(row=row, column=5)

    def Commit(self):
        Weight = int(self.Weight.get())
        Sets = int(self.Sets.get())
        Reps = int(self.Reps.get())
        Volume = (Weight*Sets*Reps)
        print(Weight, Sets, Reps, Volume)
        self.create_widgets()   # Add new row

root = tk.Tk()
app = Application(master=root)
app.mainloop()

推荐阅读