天道酬勤,学无止境

如何在 tkinter 中循环创建按钮、文本框和标签(How to create buttons, text boxes and label in loop in tkinter)

问题

我正在尝试创建一个框架来创建一个标签、文本框和按钮作为一个对象,我可以轻松地扩展它。

主意:

原来的

延长后

如果它有更多文件,它可以扩展为3、4、5或更多,只需在字典列表中声明,它就会自动扩展。

我有的代码:

def getpath(entry_box, type):
# path or file
if type == 'path':
    entry_box.set(filedial.askdirectory())
elif type == 'file':
    entry_box.set(filedial.askopenfilename())

MainWin = tk.Tk() # Create main windows
MainWin.title('Get file and path') # App name

# Create root container to hold Frames
mainFrame = ttk.Frame(MainWin)
mainFrame.grid(column=1, row=1)
# define the object to create in dictionary, format:
# {object name:[title name, default path, button name, file or folder path]}
obj2create ={'file1':['ABC Location: ', r'C:/', 'Get ABC','file'],
             'file2': ['DEF Location:', r'C:/1/', 'Get DEF', 'file']}
ttl_obj = 0
for key in obj2create:
    ttl_obj +=1
    vir = obj2create[key]
    # Module for get file:
    obj_name = key
    title = vir[0]
    default_path = vir[1]
    btn_name = vir[2]
    get_type = vir[3]

    # Create main container
    pa_frame = ttk.Frame(mainFrame)
    pa_frame.grid(column=1, row=10*ttl_obj, sticky=tk.W)
    pa_frame.config(width = 100)
    # Row 1: Label
    frame_name = obj_name + '_name'
    print(frame_name)
    frame_name = ttk.Label(pa_frame, text= title).grid(column=1, row=10*ttl_obj,sticky=tk.W)
    # Row 2: path and button
    # assign type
    path_loc = obj_name + '_path'
    path_loc = tk.StringVar()
    path_loc.set(default_path)
    # put in frame
    fileLocPath = obj_name + '_loc_path'
    fileLocPath = ttk.Entry(pa_frame, width=70, textvariable=path_loc)
    fileLocPath.grid(column=1, row=30*ttl_obj) # Assign position
    # Get file button
    # define button display text and assign the command / function
    bt_get_file_path = obj_name + '_btn'
    bt_get_file_path = ttk.Button(pa_frame, text= btn_name,
                                  command=lambda: getpath(path_loc, get_type))
    # Position Button in second row, second column (zero-based)
    bt_get_file_path.grid(column=2, row=30*ttl_obj)


# Auto popup when open
MainWin.mainloop() # Let the window keep running until close

问题:

  1. 默认文件路径仅出现在第二个文本框中。

  2. 所有按钮位置都指向第二个框。

我也不确定如何获得不同框中的值,“path_loc = obj_name + '_path'”无法获得正确的对象。

我应该如何使它工作? 还是我使用的方式不对?

回答1

Tkinter 小部件在循环中创建它们与任何其他 python 对象没有什么不同。 您的问题似乎是您不知道如何为未知数量的小部件创建唯一变量。

要知道的重要一点是,您不需要为每个小部件使用唯一的变量。 相反,您可以使用列表或字典,它们都可以在运行时轻松扩展。

在字典中保存小部件引用

这是使用字典的解决方案:

entries = {}
for key in obj2create:
    ...
    entries[key] = ttk.Entry(...)
    ...
...
print("the value for file1 is", entries["file1"].get()

创建自定义复合小部件

如果您想要创建一组要被视为一个组的小部件,最好创建一个类。 实际上,您正在创建自己的自定义小部件。 这种类型的类通常称为“复合小部件”或“megawidget”。

例如:

class FileWidget(ttk.Frame):
    def __init__(self, parent, name):
        ttk.Frame.__init__(self, parent)
        self.label = ttk.Label(self, text="%s Location" % name)
        self.fileLocPath = ttk.Entry(self)
        self.bt_get_file_path = ttk.Button(self, text=name, command=self.get_path)
        ...

    def get_path(self):
        return self.fileLocPath.get()

然后,您可以像这样在 GUI 中创建每一行:

widgets = {}
for key in obj2create:
    widgets[key] = FileWidget(mainFrame, key)
    widgets[key].pack(side="top", fill="x")

稍后,您可以像这样取回值:

for key in obj2create:
    widget = widgets[key]
    print("%s: %s" % (key, widget.get_path())
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 简单学习Python中的Tkinter模块
    书读百遍,其意自现。看Python基础的第三遍,做下笔记,让大家瞧瞧。Tkinter中先是主窗口,然后才是主要的组件: 1.标签(Label) 2. 框架(Frame) 3. 按钮(Button) 4. 输入框(Entry) 5. 单、复选按钮(Radiobutton\Checkbutton) 6. 列表框和滚动条(Listbox)(Scrollbar) 7. 对话框(messagebox)所有的组件都必须在主窗口已经存在的情况下创建,当然首先引用Tkinter库中的模块:from tkinter import * top = Tk() top.title() top.mainloop()每个组件都是一样的形式,例如:l=name(master,parameter=value....)。 name:指组件名。 master:指你的标签要存在的位置。例如上,我将主窗口命名为TOP,那么这里master即为TOP。 parameter: 标签的各种属性。其中每个组件都有的属性如下:relief组件的样式,可选有:FLAT,SUNKEN,RAISED,GROOVE,RIDGE。与高宽配合出现3D效果bd组件边框大小bg组件背景颜色fg组件前景颜色font组件中字体width组件的宽度height组件的高度组件一 标签(Label)用来在页面中显示图片或者文本。其中属性如下
  • 如何在python中制作带有按钮的窗口(How to make a window with buttons in python)
    问题 如何创建一个函数来创建一个带有两个按钮的窗口,其中每个按钮都有一个指定的字符串,如果单击,则返回一个指定的变量? 类似于此视频中的@3:05 https://www.khanacademy.org/science/computer-science-subject/computer-science/v/writing-a-simple-factorial-program---python-2(我知道这是一个非常简单的初学者程序的教程,但它是我能找到的唯一视频)但没有文本框,而且我对“确定”和“取消”按钮的作用有更多的控制。 我是否必须创建一个窗口,在其中绘制一个带有字符串的矩形,然后创建一个循环来检查鼠标移动/鼠标点击,然后在鼠标坐标位于其中一个按钮内时返回一些东西,并且鼠标被点击了? 或者是否有一个功能/一组功能可以使带有按钮的窗口更容易? 还是模块? 回答1 概述 不,您不必“绘制矩形,然后进行循环”。 你将需要做的是进口某种形式的GUI工具包,并使用方法和对象的内置到该工具包。 一般来说,其中一种方法是运行一个循环,该循环侦听事件并根据这些事件调用函数。 这个循环称为事件循环。 因此,虽然必须运行这样的循环,但您不必创建循环。 注意事项 如果您希望从提示(例如您链接到的视频)中打开一个窗口,则问题会更棘手一些。 这些工具包并非旨在以这种方式使用。 通常
  • 如何识别在循环中创建的按钮?(How can I identify buttons, created in a loop?)
    问题 我正在尝试使用 tkinter 在 python 上编写扫雷游戏。 我首先使用 10x10 的二维列表创建了一个按钮网格。 然后我使用循环创建了每个按钮,这样我就不必手动创建每个按钮并将它们夹在上面。 self.b=[[0 for x in range(1,12)] for y in range(1,12)] #The 2 dimensional list for self.i in range(1,11): for self.j in range(1,11): self.b[self.i][self.j]=tkinter.Button(root,text = (" "),command = lambda: self.delete()) # creating the button self.b[self.i][self.j].place(x=xp,y=yp) # placing the button xp+=26 #because the width and height of the button is 26 yp+=26 xp=0 基本上我希望按钮在按下时消失。 问题是我不知道如何让程序专门删除我按下的按钮,因为所有按钮都完全相同。 创建删除函数时: def delete(self): self.b[???][???].destroy()
  • 提出这些部件以及一个简短的
    Python 基础教程 Python 基础教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循环语句 Python While 循环语句 Python for 循环语句 Python 循环嵌套 Python break 语句 Python continue 语句 Python pass 语句 Python Number(数字) Python 字符串 Python 列表(List) Python 元组 Python 字典(Dictionary) Python 日期和时间 Python 函数 Python 模块 Python 文件I/O Python File 方法 Python 异常处理 Python OS 文件/目录方法 Python 内置函数 Python 高级教程 Python 面向对象 Python 正则表达式 Python CGI 编程 Python MySQL Python 网络编程 Python SMTP Python 多线程 Python XML 解析 Python GUI 编程(Tkinter) Python2.x 与 3​​.x 版本区别 Python IDE Python JSON Python 100例 Python 测验
  • 提出这些部件以及一个简短的
    Python 基础教程 Python 基础教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循环语句 Python While 循环语句 Python for 循环语句 Python 循环嵌套 Python break 语句 Python continue 语句 Python pass 语句 Python Number(数字) Python 字符串 Python 列表(List) Python 元组 Python 字典(Dictionary) Python 日期和时间 Python 函数 Python 模块 Python 文件I/O Python File 方法 Python 异常处理 Python OS 文件/目录方法 Python 内置函数 Python 高级教程 Python 面向对象 Python 正则表达式 Python CGI 编程 Python MySQL Python 网络编程 Python SMTP Python 多线程 Python XML 解析 Python GUI 编程(Tkinter) Python2.x 与 3​​.x 版本区别 Python IDE Python JSON Python 100例 Python 测验
  • 分享最全Python之tkinter—GUI(图形用户界面)文档!!!(未完成持续更新ing)
    基于tkinter的GUI界面编程 文章目录 基于tkinter的GUI界面编程 1.1GUI简介 1.2 tkinter库 1.3 tkinter 简介 1.4 导入tkinter库 1.4 创建图形用户界面步骤 2.1 tkinter 库中的组件 2.2 布局组件 3.1 常用组件 3.2 标签组件 3.3 文本框组件 3.4 菜单栏组件 3.4 选择性组件 4.1 时间处理机制 4.1.1 什么是事件 1.常用的键盘和鼠标事件 2.常用的窗口事件 1.1GUI简介 图形用户界面(Graphical User Interface, GUI, 又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其他一一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象。 1.2 tkinter库 (1) tkinter:tkinter 模块(tk 接口)是Python的标准tkGUl工具包的接口。tk
  • Tkinter:创建任意数量的按钮/小部件(Tkinter: creating an arbitrary number of buttons/widgets)
    问题 所以,我有一个列表,其中包含如下所示的条目: Option1 Placeholder1 2 Placeholder2 0 Option2 Placeholder1 4 Option3 Placeholder1 2 Placeholder2 -2 Placeholder3 6 我有一个选项列表框和一个按钮,该按钮使用所选选项的值创建一个新窗口。 我想要做的是在创建这个新窗口时创建n个按钮,其中n是所选选项的值的数量(即选项 1 到 3 分别为 2、1 和 3)。 我希望它看起来像这样: Option1 Placeholder1 [button1 containing value=2] Placeholder2 [button2 containing value=0] ...这当然很简单,如果我只是为我知道将出现的最大n数量分配一个按钮,但我想知道是否有办法更随意地做到这一点。 显然,同样的问题也适用于我需要用于值名称('PlaceholderX's)的任意数量的标签。 我一直在尝试阅读有关此类事物、变量变量等的一些资料,而且在大多数情况下(如果不是全部),这似乎是一个非常大的 NO-NO。 有些人提倡使用dictionaries ,但我真的不明白它应该如何工作(即从dict条目/值命名变量)。 这是可以(并且应该)完成的事情,还是我最好手动创建所有按钮? [编辑:添加代码]
  • JamesBin专属Python博客导航
    hello大家好,我是你们的朋友JamesBin,这篇文章主要是为了给大家进行博客导航的,方便大家的查找,下面是博客的全部连接,当然博客还在持续更新中,我会把最新的博客放到本博客中,希望大家能够关注我,一起学习python 请选择你感兴趣的文章 1. 基础篇 序号文章连接1python零基础到实践——起步2python零基础到实践——变量与简单数据类型3python零基础到实践——变量命名规则及习惯4python零基础到实践——注释5ython零基础到实践——列表6ython零基础到实践——设置代码格式7ython零基础到实践——if语句8ython零基础到实践——字典9ython零基础到实践——输入与while循环10thon零基础到实践——函数11python零基础到实践——类12python零基础到实践——文件处理 2.提高篇 序号博客链接1Python进度条之 tqdm3Python3数组操作总结4python中Tkinter 窗口之选择按钮5python中Tkinter 窗口之列表选择窗口6python中Tkinter 窗口之输入框和文本框7python中Tkinter窗口之标签和按钮8python中class 类定义与使用9python文件的读写操作10… … … 3.实验篇
  • Tkinter与我的mainloop一起管理我的事件循环(Tkinter managing my event loops alongside my mainloop)
    问题 我一直在慢慢学习Tkinter和面向对象的编程,但是我已经将自己编程与此有关。 请原谅我缺乏关于python的批判性思维,但是我问过我认识的每个人,谁比我更了解python,所以我们在这里找不到可行的解决方案。 我有一个正在运行的gui应用程序,它允许用户输入股票代码,为每个代码创建新标签,然后定期更新每个标签。 (有点像一个非常基本的电子商务应用程序之类的东西)。 我发现没有gui确实很容易做到这一点,因为我只能说: while True: sPrice = get_stock_price(s) print sPrice 但是我已经将我的get_stock_price(s)函数绑定到了一个按钮,该按钮产生了一个子框架和其中包含的标签。 我遇到的问题是标签不会更新。 一位朋友建议添加另一种仅用于更新标签的方法,但是我知道如何不断更新标签的唯一方法是 while True: # get new price # update the label # time.sleep(~1 minute?) 这会导致我的GUI窗口永久冻结并旋转。 我一直在阅读与该特定情况相关的所有其他线程,并且看到了许多不同的建议。 不要在主线程中调用sleep,不要使用root.update,不要使用事件,不要调用root.something.after(500,function)并且我已经尝试实现。
  • 如何根据整数变量的值动态创建许多标签和文本框?(How to create many labels and textboxes dynamically depending on the value of an integer variable?)
    问题 当我们例如单击“显示”按钮后知道“ n”的值时,有没有办法动态创建和显示带有“ n”个对应文本框的“ n”个标签。 让我知道是否有什么让您不明白我的问题。 谢谢! 我正在使用VS C#Express 2010 Windows窗体。 回答1 我将创建一个在其中包含标签和文本框的用户控件,并仅创建该用户控件“ n”次的实例。 如果您想知道一种更好的方法并使用属性从用户控件中访问Label和Text Box的值,请告诉我。 简单的方法是: int n = 4; // Or whatever value - n has to be global so that the event handler can access it private void btnDisplay_Click(object sender, EventArgs e) { TextBox[] textBoxes = new TextBox[n]; Label[] labels = new Label[n]; for (int i = 0; i < n; i++) { textBoxes[i] = new TextBox(); // Here you can modify the value of the textbox which is at textBoxes[i] labels[i] = new Label()
  • 如何进行 Tkinter 标签更新?(How to make a Tkinter label update?)
    问题 我有一个简单的 tkinter GUI,带有一个显示数字和按钮的标签。 我将它设置为变量 x,当按下按钮时,x 的值增加 1。 但是,当我按下按钮时,标签不会更新。 我该怎么做呢? from tkinter import * x = 1 def add(): global x x += 1 win = Tk() label = Label(win, text=x) label.pack() button = Button(win, text="Increment", command=add) button.pack() win.mainloop() 回答1 配置标签text是一种一次性效果。 稍后更新 int 不会更新标签。 要解决此问题,您可以自己显式更新标签: def add(): global x x += 1 label.configure(text=x) ...或者您可以使用 tkinter 变量,如IntVar (或更一般地说, StringVar ,如果您的文本不仅仅是数字),它会在您更新 var 时更新标签。 如果您这样做,请不要忘记配置textvariable而不是text 。 from tkinter import * win = Tk() x = IntVar() x.set(1) def add(): x.set(x.get() + 1) label
  • 如何在按下按钮时更改Tkinter标签文本(How to change Tkinter label text on button press)
    问题 我有这段代码,它的意思是当按下项目按钮时更改Instruction标签的文本。 这不是出于某种原因,我也不完全确定为什么。 我尝试在press()函数中创建另一个按钮,其名称和参数相同,但文字不同。 import tkinter import Theme import Info Tk = tkinter.Tk() message = 'Not pressed.' #Sets window Options Tk.wm_title(Info.Title) Tk.resizable(width='FALSE', height='FALSE') Tk.wm_geometry("%dx%d%+d%+d" % (720, 480, 0, 0)) #Method run by item button def press(): message = 'Button Pressed' Tk.update() #item button item = tkinter.Button(Tk, command=press).pack() #label Instruction = tkinter.Label(Tk, text=message, bg=Theme.GUI_hl2, font='size, 20').pack() #Background Tk.configure(background=Theme
  • 如何在 Tkinter 中显示/隐藏小部件?(How to show/hide widgets in Tkinter?)
    问题 我正在尝试创建一个程序,该程序在给定一系列用户输入的情况下执行某个功能。 一些用户输入仅在某些情况下是必需的,如果可能,我想仅在选择 Checkbutton 时显示这些输入值的条目框和标签,指示存在需要这些输入的情况。 我不知道该怎么做是: 将我添加的标签和输入框放在已经存在的行之间。 在取消选中 Checkbutton 时“隐藏”Labels 和 Entry 框,而不destroy它们,这样如果重新选中 Checkbutton,它们可以再次显示而不会丢失任何已经输入的数据。 示例:我选择 Checkbutton,在出现的新框中输入数据,然后取消选中 Checkbutton(导致这些框不再显示)。 如果我随后重新选择 Checkbutton,我上次选择 Checkbutton 时输入的数据应该仍然存在。 如果 Checkbutton 在之前被取消选择后重新选择,则“显示”之前“隐藏”的相同标签和条目框。 我不知道这样的事情是否可能,但如果不是,请告诉我。 另外,我知道我可以在取消选择 Checkbutton 时简单地将相关条目框的state为DISABLED ,但如果可能的话,我希望这些框不出现,这样它们的存在就不会混淆不熟悉的用户需要额外投入的情况。 如果这是相关的,我在 Windows 10 专业版上使用 Python 2.7.9、Anaconda 2.2.0(64 位
  • 如何使用python在tkinter中更改按钮和框架的字体和大小?(How to change font and size of buttons and frame in tkinter using python?)
    问题 这是我用来在tkinter中生成一个简单的文本框和一个按钮的代码。 要使框架和按钮具有更好的外观,应该使用哪些参数? root = Tk.Tk() def submit(): query = entry.get() retrieve(query) entry = Tk.Entry(root) entry.pack() button = Tk.Button(root, text='submit', command=submit) button.pack() root.mainloop() 回答1 更新:New Mexico Tech tkinter网站已存档在GitHub上。 首先,Tkinter的最佳参考是这个新墨西哥科技网站。 在目录中,您会找到有关字体的部分,在“按钮”小部件中会找到选项font 。 您必须具有Tkinter对象才能创建字体 Python-2 自2020年1月1日起,对Python-2的支持已正式结束 from Tkinter import * # Note: UPPER case "T" in Tkinter import tkFont root = Tk() Python-3 Python-3 Tk包装器与Python-2不同 from tkinter import * # Note: lower case "t" in tkinter from
  • 如何在Python Tkinter中创建按钮以将整数变量增加1并显示该变量?(How do I create a button in Python Tkinter to increase integer variable by 1 and display that variable?)
    问题 我正在尝试创建一个Tkinter程序,该程序将存储一个int变量,并在每次单击按钮时将该int变量增加1,然后显示该变量,以便可以看到它以0开始,然后每次单击按钮上升1。我正在使用python 3.4。 import sys import math from tkinter import * root = Tk() root.geometry("200x200") root.title("My Button Increaser") counter = 0 def nClick(): counter + 1 def main_click(): mLabel = Label(root, text = nClick).pack() mButton1 = Button(text = "Increase", command = main_click, fg = "dark green", bg = "white").pack() root.mainloop() 回答1 您可以使用Tkinter变量。 当您需要修改其他小部件可能与之交互的数据时,它们特别有用。 这是与问题中的代码相似的代码,但不是将counter定义为普通变量,而是Tkinter的变量。 import tkinter import sys root = tkinter.Tk() root.geometry(
  • Python tkinter -第三章 tkinter (窗口创建与Pack布局)
    第3章 tkinter 3.1 第一个tkinter程序 tkinter的程序很容易编写。难点是在后面的布局以及参数的传递。很多控件(Widget)的使用方法都可以从网络上快速的找到。 简单的tkinter窗口程序如下: import tkinter root = tkinter.Tk() root.mainloop() 结果: 只用三行程序就可以构建一个窗口程序,的确非常简单。不过这个程序没有大的用处。整个窗口也是空白的。我们会在后面的章节里面加入其他的控件,让这个窗口具有更多的功能。 详细解读一下上面的程序: (1)Import tkinter 是引入tkinter模块。所有的控件(Widget)都在里面有定义。 (2)root = tkinter.Tk() 是实例化Tk类。Tk类是顶层的控件类,完成窗口的一系列初始化。有兴趣的可以看tkinter类的__init__.py,看看Tk是如何完成初始化的。 (3)root.mainloop() 是主窗口循环。 3.2 窗口的基本属性 空白的窗口没有什么用处,这节会介绍一些关于窗口的基本属性与功能。 3.2.1 窗口标题 给窗口加一个标题,表明这个窗口是做什么的。一般都是显示程序的名称。或者动态的提示消息,比如打开的文件名称等。 添加标题的语句是: root.title('Hello') 把这条语句加在mainloop(
  • 在 python 上,如何确定单击了哪个按钮(On python, how do I determine which button was clicked)
    问题 我将如何运行 if 语句来确定单击了哪个按钮? 我一直在环顾四周,但我是 Tkinter 的新手,我不太确定我应该做什么。 self.button1 = Tkinter.Button(self,text=u"Convert Decimal to Binary", command=self.OnButtonClick) self.button1.grid(column=1,row=1) self.button2 = Tkinter.Button(self,text=u"Convert Binary to Decimal", command=self.OnButtonClick) self.button2.grid(column=1,row=2) 回答1 您可以像这样将每个按钮的command选项设置为 lambda: self.button1 = Tkinter.Button(self, ..., command=lambda: self.OnButtonClick(1)) ... self.button2 = Tkinter.Button(self, ..., command=lambda: self.OnButtonClick(2)) 然后,让self.OnButtonClick接受一个参数,即按钮的“id”。 它会是这样的: def OnButtonClick(self
  • 如何在Tkinter中的一个按钮中包含图像和文本(How to have image + text in one button in Tkinter)
    问题 我正在尝试创建一个按钮,该按钮将包括一个左对齐的图像和一个右对齐的文本。 我只想通过参数“文本”来更改文本,而不是通过修改整个图像。 这有可能吗? 这是一个简单的例子,我的意思是。 http://img651.imageshack.us/img651/3776/previewrv.png 希望我能解释清楚 谢谢 回答1 查看标签上的compound选项。 它使您可以指定标签与文本的关系(顶部,底部,左侧,右侧,无)。 例如: import Tkinter as tk class View(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.image = tk.PhotoImage(file="somefile.gif") b = tk.Button(self, text="Hello, world", image=self.image, compound="left") b.pack(side="top") if __name__ == "__main__": root = tk.Tk() view = View(root) view.pack(side="top", fill="both", expand=True) root
  • 如何确定哪个按钮被按下了 Python TKinter 中的按钮网格?(How to determine which button is pressed out of Button grid in Python TKinter?)
    问题 我正在使用 Python TKinter 编写一个 GUI,其中我有一个包含 24 个按钮的网格,这些按钮是我使用循环(不是单独创建的)创建的。 有什么方法可以获取我按下的按钮的文本。 由于它处于循环中,即使使用 lambda 的回调函数也无济于事。 我不想为按下每个不同按钮时发生的情况编写单独的代码。 我只需要知道相应按钮的文本,以便我可以启动另一个仅适用于该文本的通用函数。 ps:我可以使用 List 和 curselection() 执行相同的任务,并且不希望这样。 self.num = 11 for r in range(0,5): for c in range(0,3): R = r; C = c resNum = "Ch0"+str(self.num); self.button1_rex = tk.Button(self.frame, text = resNum,font=("Helvetica", 14), justify = CENTER,width = 20, command = self.new_window) self.button1_rex.grid(row=R, column=C, sticky=W) self.num = self.num+1 self.new_window 是打开新窗口的函数,需要根据按钮编号做其他功能(如“Ch011”等)
  • 如何创建Tkinter GUI停止按钮以打破无限循环?(How do you create a Tkinter GUI stop button to break an infinite loop?)
    问题 因此,我有一个Tkinter GUI,其中有两个简单的选项,即开始和停止按钮。 我已经定义了GUI布局: from Tkinter import * def scanning(): while True: print "hello" root = Tk() root.title("Title") root.geometry("500x500") app = Frame(root) app.grid() 此处的“开始”按钮运行无限循环扫描,而“停止”按钮在按下时应会中断: start = Button(app, text="Start Scan",command=scanning) stop = Button(app, text="Stop",command="break") start.grid() stop.grid() 但是,当我按下“开始”按钮时,它总是被按下(假设由于无限循环)。 但是,我无法单击“停止”按钮来退出while循环。 回答1 您无法在Tkinter事件循环所处的同一线程中启动while True:循环。这样做会阻塞Tkinter的循环并导致程序冻结。 对于一个简单的解决方案,您可以使用Tk.after每秒钟左右在后台运行一个进程。 下面是一个脚本来演示: from Tkinter import * running = True # Global flag