【问题标题】:How can I get the value of a button clicked如何获取单击的按钮的值
【发布时间】:2021-01-21 10:46:13
【问题描述】:

我有一些 python 代码使用我的 SQL 表中的数据生成按钮。有没有办法我可以获取我选择的按钮的文本,因为我拥有的代码只会检索 for 循环中的最后一个值。我不能为每个按钮创建一个变量,因为每个站点的房间数量都不同。

def search():
global screen13
global btn
global roomclicked
screen13 = Tk()
screen13.geometry("300x250")
screen13.title("Rooms")
sitename3_info = sitename.get().strip()
if sitename3_info:
    cursor = cnn.cursor()
    # combine the two SQL statements into one
    sql = ("SELECT roomname FROM rooms, Sites "
           "WHERE rooms.siteID_fk2 = Sites.siteID AND siteName = %s")
    cursor.execute(sql, [sitename3_info])
    rooms = cursor.fetchall()
    # remove previous result (assume screen13 contains only result)
    for w in screen13.winfo_children():
        w.destroy()
    if rooms:
        for i, row in enumerate(rooms):
            roomname = row[0]
            roomclicked = roomname
            btn = Button(screen13, text=roomname, command=lambda room=roomname: action(room))
            btn.grid(row=i, column=0)
    else:
        Label(screen13, text="No room found").grid()
        

谢谢!

【问题讨论】:

  • 为按钮创建一个类
  • 你可能想看看this

标签: python mysql tkinter dynamic-arrays tkinter-button


【解决方案1】:

编辑:您需要使用一个类来存储每个按钮的实例。

使用.cget()

from tkinter import *

screen13 = Tk()
screen13.geometry("300x250")
screen13.title("Rooms")

class buttongen():
    def __init__(self,x):
        self.btn = Button(screen13, text=word, command=lambda:print(self.btn.cget('text')))
        self.btn.pack()

for word in ('red', 'blue', 'orange', 'white'):
   buttongen(word)


screen13.mainloop()

我无权访问您的表格,但我尝试使用您的代码进行操作,它应该可以工作

class buttongen():
    def __init__(self,i,row):
        self.i = i
        self.row = row

        self.roomname = self.row[0]
        roomclicked = self.roomname
        self.btn = Button(screen13, text=self.roomname, command=lambda :print(self.roomname))
        self.btn.grid(row=i, column=0)

def search():
    global screen13
    global btn
    global roomclicked
    screen13 = Tk()
    screen13.geometry("300x250")
    screen13.title("Rooms")
    sitename3_info = sitename.get().strip()
    if sitename3_info:
        cursor = cnn.cursor()
        # combine the two SQL statements into one
        sql = ("SELECT roomname FROM rooms, Sites "
               "WHERE rooms.siteID_fk2 = Sites.siteID AND siteName = %s")
        cursor.execute(sql, [sitename3_info])
        rooms = cursor.fetchall()
        # remove previous result (assume screen13 contains only result)
        for w in screen13.winfo_children():
            w.destroy()
        if rooms:
            for i, row in enumerate(rooms):
                buttongen(i, row)
                roomname = row[0]
                roomclicked = roomname
                btn = Button(screen13, text=roomname, command=lambda room=roomname: action(room))
                btn.grid(row=i, column=0)
        else:
            Label(screen13, text="No room found").grid()

【讨论】:

  • 按钮是根据数据库中存储的内容自动生成的。我想知道如何从单击的按钮中获取文本,因为代码正在从已生成的最后一个按钮中获取文本。
  • 所以 lambda 中的函数应该打印按钮的文本?
  • 如何在点击的按钮上打印文本
  • 没关系,我发现问题出在哪里, button(i,row) 是下面的值,因为按钮被创建了两次,所以下面的值是不必要的。我删除了下面的值并保留了课程,谢谢
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多