繁体   English   中英

在Tkinter Python中使用子窗口创建多个按钮

[英]Create multiple buttons with sub windows in Tkinter Python

我在数据框中有Accountid列。 现在我正在使用Tkinter绘制一些图形用户界面。 我想为每个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()​

在此循环之后:

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)

idExample类的局部变量。 在上述for循环的末尾, id设置为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将永远与最新值comapare 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类,该类为数据new_button的每个AccountId创建一个唯一的按钮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM