python - bind.() 函数只发送最后一个参数
问题描述
我正在使用 tkinter 在 python 中开发一个聊天程序,我想让用户点击一个名字并在一个新的 tkinter 窗口中打开一个聊天,但是当我点击名字时,只有姓氏会通过。
我最初使用 while 循环来遍历数据库中的不同用户。
为了修复这个错误,我切换到了一个 for 循环,但没有任何改变。
这是我当前的代码:
def openchat(event):
root= Tk()
root.title(contactname)
print("everything binds to this")
print("contactname: %s" % contactname)
def contacts():
c.execute("SELECT contact_id FROM contacts WHERE user_id = ?", (session_id[0], ))
row = c.fetchall();
print("prints contact id: %s" % row, "\n")
rowlength = len(row)
x = 0
print(row[x][0])
#while x < rowlength:
for i in row:
c.execute("SELECT * FROM users WHERE user_id = ?", (row[x][0], ))
row2 = c.fetchone();
print("('contact_id', 'contactname', 'password', 'chat_id')")
print(row2)
contactname[0] = row2[1]
print("contactname: %s" % contactname, "x: %s" % x, "\n")
contactframe = Frame(leftframe, bg="#00A098", highlightthickness=2.5, highlightbackground="Black")
contactframe.pack(side = TOP, fill=X)
contactframe.bind("<Button-1>", lambda event: openchat(contactname))
n = Label(contactframe, text=contactname, fg="Black", bg='#00A098')
n.config(font=("Ariel", 20))
n.bind("<Button-1>", lambda event: openchat(contactname))
n.pack()
x+=1
这是我运行程序时得到的终端输出:
contact function:
prints contact id: [('2',), ('3',), ('4',)]
2
('contact_id', 'contactname', 'password', 'chat_id')
('2', 'brian', 'brian', '2')
contactname: ['brian'] x: 0
('contact_id', 'contactname', 'password', 'chat_id')
('3', 'abdi', 'abdi', '3')
contactname: ['abdi'] x: 1
('contact_id', 'contactname', 'password', 'chat_id')
('4', 'john', 'john', '4')
contactname: ['john'] x: 2
以上所有内容都按预期完美运行,但这是我搞砸的地方。一切都绑定到最后一次联系,约翰
contactname: ['john']
contactname: ['john']
contactname: ['john']
但它应该显示如下内容:
contactname: ['brian']
contactname: ['abdi']
contactname: ['john']
我目前的理论是绑定功能仅在我单击按钮时运行,因此仅输出最后一个联系人姓名,但我可能是错的。
如果有人能告诉我我哪里做错了或指出我正确的方向,我将不胜感激。
提前致谢
==============
我想出了一个对我有用的解决方案,这是我的最终代码,以防其他人有类似的问题:
def openchat(i):
c.execute("SELECT * FROM users WHERE user_id = ?", (i, ))
row = c.fetchall();
contactname = row[0][1]
root= Tk()
root.title(contactname)
print("contactname: %s" % contactname)
def contacts(self):
c.execute("SELECT contact_id FROM contacts WHERE user_id = ?", (session_id[0], ))
row = c.fetchall();
print("prints contact id: %s" % row, "\n")
rowlength = len(row)
minrow = min(row)
maxrow = max(row)
minrow2 = minrow[0]
maxrow2 = maxrow[0]
minrow2 = int(minrow2)
maxrow2 = int(maxrow2)
x = 0
print(row[x][0])
for i in range(minrow2,maxrow2+1):
self.contact_id = i
c.execute("SELECT * FROM users WHERE user_id = ?", (row[x][0], ))
row2 = c.fetchone();
print(row2)
contactname[0] = row2[1]
print("contactname: %s" % contactname, "x: %s" % x, "\n")
contactframe = Frame(leftframe, bg="#00A098", highlightthickness=2.5, highlightbackground="Black")
contactframe.pack(side = TOP, fill=X)
n = Button(contactframe, text=contactname, fg="Black", bg='#00A098', command = lambda i=i: openchat(i))
#n.config(font=("Ariel", 20))
n.pack()
x+=1
解决方案
评论:当我使用
'text'
我得到这个错误_tkinter.TclError: unknown option "-text"
以下对我有用:
class App(tk.Tk):
def __init__(self):
super().__init__()
n = tk.Label(self, text='test', fg="Black", bg='#00A098')
n.config(font=("Ariel", 20))
n.bind("<Button-1>", self.openchat)
n.grid(row=0, column=0)
def openchat(self, event):
print("event from {}".format(type(event.widget))
# >>> event from <class 'tkinter.Label'>
print("event from {}".format(event.widget['text']))
# >>> event from test
if __name__ == "__main__":
App().mainloop()
用 Python 测试:3.5 - 'TclVersion':8.6 'TkVersion':8.6
推荐阅读
- c# - 如何在 ASP.NET MVC 中使用 Windows Active Directory 登录?
- visual-studio - Visual Studio 2019 WebBrowser 扩展问题
- kubernetes - ssl 后面的 Traefik 终止负载均衡器返回 404
- .net - 在 Rider 中运行配置启动外部程序
- html - 对齐横幅中心的文本
- javascript - 如何使用函数及其值作为参数?
- reactjs - 编译失败。找不到模块:无法解析“firebase”
- python - 在一个图中绘制两个 Seaborn 猫图
- python - 解密数据帧 Fernet 中的列(令牌必须是字节)
- google-chrome-extension - 页面加载时的 Chrome/opera 浏览器扩展,在后台加载另一个页面以获取数据