我在Dataframe中有Accountid列。现在我正在使用Tkinter绘制一些gui。对于每个Accountid,我想创建一个单独的按钮。我的代码能够做到这一点。但在此之后,我想为每个按钮创建一个子窗口,其中包含每个Accountid的一些列。现在的问题是我的代码为每个按钮创建了子窗口,但它只为最后一个Accountid提取了列。
如果有人可以帮助我,我真的很感激。
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
for id in df['AccountId']:##for each id create a button
new_win_button = tk.Button(self, text=id,
command= self.new_window)
new_win_button.pack(side="top", padx=20, pady=20)
def new_window(self):
top = tk.Toplevel(self)# create sub window
print (id)
#print (id is 'id')
label = tk.Label(top, text=s3.loc[s3.AccountId == id][['AccountId','confidence','lift']])
label.pack(side="top", fill="both", expand=True, padx=20, pady=20)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
答案 0 :(得分:1)
此循环后:
for id in df['AccountId']:##for each id create a button
new_win_button = tk.Button(self, text=id,
command= self.new_window)
new_win_button.pack(side="top", padx=20, pady=20)
id
是类Example
的局部变量。 id
设置为上述for循环结尾的df['AccountId']
的最后一个值。例如:
for i in range(0,10):
pass
print i
结果:
9
所以在
label = tk.Label(top, text=s3.loc[s3.AccountId == id][['AccountId','confidence','lift']])
比较s3.AccountId == id
将始终与id
的最新值一致,这就是为什么您总是只获取最后一个Accountid的列。
解决方法:
import tkinter as tk
import pandas as pd
root = tk.Tk() #declare root in global scope for simplicity
class new_button:
def __init__(self,A_id):
self.id=A_id
but = tk.Button(root,text=self.id,command=self.new_window)
but.pack(side="top", padx=20, pady=20)
def new_window(self):
top = tk.Toplevel(root)# create sub window
label = tk.Label(top, text=s3.loc[s3.AccountId == self.id][['AccountId','confidence','lift']])
label.pack(side="top", fill="both", expand=True, padx=20, pady=20)
if __name__ == "__main__":
for i in df['AccountId']:##for each id create a button
butt=new_button(A_id=i)
root.mainloop()
创建了一个new_button
类,为数据框中的每个AccountId
创建一个唯一按钮。