如何在另一个Tkinter类中使用滚动条小部件功能并将其绑定到按钮

时间:2014-01-29 12:22:29

标签: python button tkinter scrollbar tk

我创建了一个Tkinter类Ext(),其中包含create_scrollbar()方法中variabel self.text中任何文本的滚动条。我想通过将它绑定到类Application中的Buttons来使用此方法,以便在按下Button时文本显示在滚动条中。我已经尝试将其作为一个类首先实现,但是当在同一个类中使用两个 init 时会导致问题。如何在Applications类中的callback,self.callback中调用Ext中的create_scrollbar?

from Tkinter import *
import Tkinter as tk
class Ext(tk.Frame):

    """ a scrollbar creation class, extends the class Application"""
    def __init__(self, master):
        """ init the frame """
        tk.Frame.__init__(self)

        self.text = tk.StringVar()



        tk.Frame.__init__(self, master)
        self.scrollbar = tk.Canvas(master, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.scrollbar, background="#ffffff")
        self.txt = tk.Scrollbar(master, orient="vertical", command=self.scrollbar.yview)
        self.scrollbar.configure(yscrollcommand=self.txt.set)
        self.scrollbar.configure(width=500, height=200)

        self.txt.pack(side="right", fill="y")
        self.scrollbar.pack(side="left", fill="both", expand=True)
        self.scrollbar.create_window((0,0), window=self.frame, anchor="nw", 
                                  tags="self.frame")



        self.create_scrollbar()

    def create_scrollbar(self):

        tk.Label(self.frame, text=self.text).grid(column=1)








class Application(Frame):

    def __init__(self, root):
        """ init the frame """
        Frame.__init__(self)
        self.grid()
        self.create_widgets()
    def create_widgets(self):


        Button = Button(self, text = "Display scrollbar!", command = self.callback)
        Button.grid(row = 10, column = 1, sticky = W)




    def callback(self):
        self.text = "this is a test sentence

        print create_scrollbar(t)  # Print scrollbarwidget from the Ext() class when the Button is pressed
#Main
root = Tk()
root.title("Maltparser1.0_demo")

root.geometry("900x700")
root.mainloop()


app = Application(root)
master = tk.Tk()

master  = Ext(master)
master.title("Instructions")
master.geometry("800x300")
Ext(master).pack(side="top", fill="both", expand=True)

master.mainloop()

1 个答案:

答案 0 :(得分:0)

要回答您的具体问题,要调用create_scrollbar方法,首先需要创建该类的实例。例如:

def callback:
    e = Ext(self)
    e.create_scrollbar()

然而,这不符合您的想法,因为您永远不会告诉它要显示的文本。在callback中,self.text生活在App班级,而不是Ext班级。也许你想将字符串或textvariable传递给Ext类的构造函数。

顺便说一下,你的代码非常令人困惑。您创建了一个名为self.frame的框架 - 这是有意义的 - 但是一个名为self.scrollbar的画布,一个名为self.txt的滚动条和一个名为self.text的stringvar。然后,您有一个名为create_scrollbar的方法,它创建一个标签。最后,您从类Button创建一个按钮,然后将其命名为Button。您不能同时拥有具有相同名称的类和实例。

也许这些名字对你有意义,但作为不属于你的人,我认为你的名字选择会使你的代码难以理解。