在Tkinter Python中创建带子窗口的多个按钮

时间:2018-02-14 06:32:20

标签: python button tkinter

我在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()​

1 个答案:

答案 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创建一个唯一按钮。