Python 通过按按钮克隆标签、按钮和文本框

Python 通过按按钮克隆标签、按钮和文本框,python,python-3.x,tkinter,clone,Python,Python 3.x,Tkinter,Clone,我正在试着写一个简单的存货盘点程序。 创建了一行,您可以在其中放置文章名称并添加、删除或重置值。 我想添加一个按钮,将克隆整行并粘贴一个新的下面它。 我可以增加计数器的数量,然后用新的计数器编号复制并粘贴部分代码。当新条目到达时,调整代码不是很方便。 这是我的程序,目前还不知道如何处理,非常感谢您的帮助: import tkinter import sys root = tkinter.Tk() root.geometry("800x800") root.title("Counter") co

我正在试着写一个简单的存货盘点程序。 创建了一行,您可以在其中放置文章名称并添加、删除或重置值。 我想添加一个按钮,将克隆整行并粘贴一个新的下面它。 我可以增加计数器的数量,然后用新的计数器编号复制并粘贴部分代码。当新条目到达时,调整代码不是很方便。 这是我的程序,目前还不知道如何处理,非常感谢您的帮助:

import tkinter
import sys

root = tkinter.Tk()
root.geometry("800x800")
root.title("Counter")
counter = tkinter.IntVar()


def onClick(event=None):
    counter.set(counter.get() + 1)

tkinter.Label(root, textvariable=counter).place(x=480, y=20)


tkinter.Button(root, text="+1", command=onClick, fg="dark green", bg = "white").place(x=520, y=20)
def onClick(event=None):
    counter.set(counter.get() + 10)
tkinter.Button(root, text="+10", command=onClick, fg="dark green", bg = "white").place(x=560, y=20)

def onClick(event=None):
    counter.set(counter.get() - 1)


tkinter.Button(root, text="-1", command=onClick, fg="dark red", bg = "white").place(x=440, y=20)
def onClick(event=None):
    counter.set(counter.get() - 10)
tkinter.Button(root, text="-10", command=onClick, fg="dark red", bg = "white").place(x=400, y=20)


def onClick(event=None):
    counter.set(counter.get()-counter.get()) 

tkinter.Button(root, text="Reset", command=onClick, fg="Black", bg = "white").place(x=620, y=20)



T = tkinter.Text(root, height=1, width=40)

    T.place(x=10, y=20)

root.mainloop()

要进行克隆,首先必须将小部件保存在(全局)变量中

但是,您应该创建一个函数,当您按下按钮时,该函数将创建新的
标签
文本
按钮

但除了创建
标签
文本
按钮
之外,您还可以使用
tkinter.Frame
来定义自己的小部件,即
类行
,然后按下按钮时只需创建
。小部件也可以有自己的
计数器
,只为此行保留值


我定义了类
,它使用
来保持
标签
文本
按钮
IntVar
。每次按下按钮“添加行”时,我都可以创建新的

我还使用了
pack()
而不是
place()
,因此我不必计算
x
y

我将行保留在列表中,这样我就可以从每一行中获取
计数器
,并对它们求和

import tkinter
import sys

# --- classes ----

class Row(tkinter.Frame):

    def __init__(self, parent, row_number):
        super().__init__(parent)

        self.counter = tkinter.IntVar()

        tkinter.Label(self, text=str(row_number)).pack(side='left')

        t = tkinter.Text(self, height=1, width=40)
        t.pack(side='left')

        tkinter.Button(self, text="+1",  command=lambda:self.add(1)).pack(side='left')
        tkinter.Button(self, text="+10", command=lambda:self.add(10)).pack(side='left')

        tkinter.Label(self, textvariable=self.counter).pack(side='left')

        tkinter.Button(self, text="-1",  command=lambda:self.add(-1)).pack(side='left')
        tkinter.Button(self, text="-10", command=lambda:self.add(-10)).pack(side='left')
        tkinter.Button(self, text="Reset", command=self.set).pack(side='left')

    def add(self, value):
        self.counter.set(self.counter.get() + value)

    def set(self, value=0):
        self.counter.set(value) 

# --- functions ---

def add_row():
    number = len(all_rows) + 1
    row = Row(root, number)
    row.pack()
    all_rows.append(row)

def sum_rows():
    # get counters from all rows and sum them
    label_sum['text'] = sum(row.counter.get() for row in all_rows)

# --- main ---

all_rows = []

root = tkinter.Tk()
root.geometry("800x800")
root.title("Counter")

tkinter.Button(root, text='Add row', command=add_row).pack()
tkinter.Button(root, text='Sum rows', command=sum_rows).pack()

label_sum = tkinter.Label(root, text='')
label_sum.pack()

add_row() # one row at start

root.mainloop()

创建一个函数,该函数不进行克隆,而是创建具有新值的新窗口小部件。若要克隆某些内容,必须首先将其分配给(全局)变量。目前,您没有将小部件分配给任何变量,因此您无法访问它们来克隆它们。但与其克隆,不如创建一个新函数。不应创建许多同名函数-
onClick
。在某些时刻,很难说按钮使用的是哪个功能。最好创建
onClickAdd1
onClickAdd10
或使用
lambda
为按钮分配相同的函数,但参数不同
command=lambda:onClickAdd(10)
command=lambda:onClickAdd(1)
您还可以使用
Frame
创建自己的带有
标签的小部件,
Text
和一些代码,然后您必须在按下按钮时创建此小部件。当您要隐藏行时,您必须只隐藏这个小部件。