当前位置: 首页 > 知识库问答 >
问题:

如何在GUI窗口中多次放置同一标签(使用tkinter)?

颜哲彦
2023-03-14

我已经用tkinter在Python中写了几个图形用户界面程序。对于其中几个,我添加了一个“ADD”按钮,当按下该按钮时,它会向窗口添加一行新部件。由于编码这可能很耗时,我创建了一个类,其中包含一个方法,该方法可以添加一行小部件。然而,当我测试它时,它不能正常工作。一旦我添加了小部件的第一行,我添加的任何后续行似乎都只是放在前一行之上。我的代码如下:

import tkinter as tk


class Row:
   def __init__(self, name, row_widgets):
       self.name = name
       self.row_widgets = row_widgets

   def add(self, previous_row_no, column_start_no, widget_rows):
       row_no = previous_row_no + 1
       column_no = column_start_no
       widgs = []
       for widget in self.row_widgets:
           widget.grid(column=column_no, row=row_no)
           column_no += 1
           widgs.append(widget)
       widget_rows.append(widgs)
       return row_no, widget_rows


root = tk.Tk()
root.geometry('200x200')

widgrows = []
label1 = tk.Label(root, text='Label 1')
label2 = tk.Label(root, text='Label 2')
label3 = tk.Label(root, text='Label 3')
row1_widgets = [label1, label2, label3]
row1 = Row('row1', row1_widgets)

# Add 3 rows of widgets
row1.add(0, 0, widgrows)
row1.add(1, 0, widgrows)
row1.add(2, 0, widgrows)

root.mainloop()

此代码生成以下窗口,其中只有一行小部件:

创建窗口

但是,我需要3行小部件,如下图所示:

希望的窗口

似乎问题在于每次我使用add方法时,它都使用相同的小部件。例如,我第一次使用add方法时,它采用label1并将其放置在第1行第0列中。下次使用add方法时,就好像它将label1从第1行中取出并放入第2行一样。我对Python非常陌生,所以我不确定这是否是正在发生的事情,但经过一些实验之后,这似乎是正在发生的事情。

关于如何让它正常工作,而不必使用相同的文本创建多个标签,有什么想法吗?

共有2个答案

柯镜
2023-03-14

您需要创建每个标签或复制这3个标签。大概是这样的:

widgrows = []
row1 = None
for j in range(3):
    labels = []
    for i in range(3):
        label = tk.Label(root, text=f'Label {i}')
        labels.append(label)
    if not row1:
        row1 = Row('row1', labels)
    else:
        row1.row_widgets = labels
    row1.add(j, 0, widgrows)
楚泳
2023-03-14

这是一种稍微不太复杂的实现预期结果的方法。

标签可以创建不同数量的行和列,每一行和列都有自己的名称,并存储在行中。行窗口小部件

我已删除根目录。几何图形以允许tkinter计算必要的窗口大小。

import tkinter as tk

class Row:

    def __init__(self, master, name):
        self.master = master
        self.name = name
        self.row_widgets = []

    def add(self, text, r = 0, c = 0, s = "nsew"):
        L = tk.Label(self.master, text=text)
        L.grid(row = r, column = c, sticky = s)
        self.row_widgets.append(L)

root = tk.Tk()
# root.geometry('200x200')

rows = Row(root, 'row')

i = 0
for r in range(4):
    for c in range(4):
        rows.add(f'Label_{i:02}', r = r, c = c)
        i = i + 1

for labels in rows.row_widgets:
    print(labels["text"])

root.mainloop()
 类似资料:
  • 问题内容: 我有一个3d渲染程序,该程序根据鼠标在屏幕上的位置围绕观察者旋转世界。这条线定义了地球旋转的弧度量 其中xy [0]是屏幕中心的x坐标 这意味着观察者视野的旋转量受到鼠标可以移动的距离的限制。如果我能使鼠标回到屏幕中央,则可以解决此问题。有任何想法吗? 问题答案: 好消息是有一种方法可以做到。 中间的消息是,它没有很好的记录。 坏消息是它仅在某些平台上有效。 另一个中间消息是,您至少可

  • 问题内容: 我刚开始使用PyQt5。我一直在尝试完成一个看似非常简单的任务,但没有获得足够的信息。经过大量的谷歌搜索,我已经能够关闭一个窗口,并在另一个UI加载时启动另一个窗口,但这不是我要在这里做的。 我想在同一窗口中切换UI。我正在将UI文件作为全局变量加载到我的python文件中,其中每个UI有2个类。当我单击一个UI中的特定按钮时,我想切换到同一窗口中的另一个UI。下面是代码示例: 问题答

  • 对于我的项目,我希望有一个切换按钮。经过大量研究,我找到了这篇文章。toggle-Switg-in-qt 我在上面的链接上实现了第三个帖子的代码。 这段代码工作正常。缺点是我不明白如何为切换按钮的两种状态添加QLabel?有人想过做这个操作吗?

  • 我正在创建一个safari扩展。如何手动将新选项卡/窗口设置为我选择的URL?我使用了这篇文章中的一些逻辑来确保我只是接管了用户创建的选项卡/WindowsSafariExtension:Event来创建一个全新的选项卡? 我设置了我的新选项卡事件侦听器: 使用此选项处理打开的选项卡/窗口: 当一个新的选项卡/窗口打开时,我能够发出警报,但我一辈子都不知道如何浏览到url。我尝试了window.l

  • 我正在迁移一些JSP文件到Thymeleaf,我发现了以下问题。在原始的JSP代码中,有一个包含在许多其他JSP文件中的文件,其行如下: 在包含此变量的文件中,变量的使用方式如下: 设置同时在所有位置使用的多个属性。这里的要点是,您在一个文件中设置了,其值在所有其他文件中使用。如果需要更改属性的值,则只需更改一个文件。 为了在Thymeleaf中复制这一点,我尝试以下列方式使用属性。首先,我在模型

  • 我试图在Chrome中找到某种功能设置或配置文件来自动打开一个新窗口中的链接,这些链接应该在一个标签中打开,但没有找到任何令人信服的解决方案,大多数建议都是Ctrl+点击链接。