通过按下按钮克隆标签、按钮和文本框
Clone Label, Button and Textbox by pressing a button
我正在尝试编写一个简单的库存盘点程序。
创建了一行,您可以在其中放置文章名称并添加、删除或重置值。
我想添加一个按钮,该按钮将克隆整行并在其下方粘贴一个新按钮。
我可以增加计数器的数量,只需复制并粘贴带有新计数器编号的部分代码。当新条目到达时调整代码不是很方便。
这是我的程序,到目前为止不知道如何处理它,非常感谢任何帮助:
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()
要克隆,您必须首先将小部件保存在(全局)变量中。
但是你应该创建一个函数,而不是克隆,当你按下按钮时,它会创建新的 Label
、Text
、Button
。
但是除了创建 Label
、Text
、Button
,您还可以使用 tkinter.Frame
来定义自己的小部件 - 即。 class Row
- 然后你只需在按下按钮时创建 Row
。小部件也可以有自己的 counter
以仅保留此行的值。
我定义了class Row
,它使用Frame
来保留Label
、Text
、Button
和IntVar
。每次按下按钮 "Add row"
时,我都可以创建新的 Row
我也用pack()
代替place()
所以我不用计算x
,y
我将行保留在列表中,这样我就可以从每一行中得到 counter
并对它们求和。
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()
我正在尝试编写一个简单的库存盘点程序。 创建了一行,您可以在其中放置文章名称并添加、删除或重置值。 我想添加一个按钮,该按钮将克隆整行并在其下方粘贴一个新按钮。 我可以增加计数器的数量,只需复制并粘贴带有新计数器编号的部分代码。当新条目到达时调整代码不是很方便。 这是我的程序,到目前为止不知道如何处理它,非常感谢任何帮助:
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()
要克隆,您必须首先将小部件保存在(全局)变量中。
但是你应该创建一个函数,而不是克隆,当你按下按钮时,它会创建新的 Label
、Text
、Button
。
但是除了创建 Label
、Text
、Button
,您还可以使用 tkinter.Frame
来定义自己的小部件 - 即。 class Row
- 然后你只需在按下按钮时创建 Row
。小部件也可以有自己的 counter
以仅保留此行的值。
我定义了class Row
,它使用Frame
来保留Label
、Text
、Button
和IntVar
。每次按下按钮 "Add row"
Row
我也用pack()
代替place()
所以我不用计算x
,y
我将行保留在列表中,这样我就可以从每一行中得到 counter
并对它们求和。
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()