tkinter-连接到文本小部件的滚动条可见,但没有任何滑块。

时间:2014-01-18 20:18:55

标签: python tkinter

我正在构建一个需要显示大量文本的程序,我需要将一个滚动条附加到Text小部件。

我正在使用Windows 7,python 3.3 ...... 这是我正在使用的一个小的(可能的)例子。我觉得我在这里错过了一些非常明显的东西,而这正在推动我 * *疯狂。

import datetime
import tkinter as tk
import tkinter.messagebox as tkm
import sqlite3 as lite


class EntriesDisplayArea(tk.Text):
    """
    Display area for the ViewAllEntriesInDatabaseWindow
    """
    def __init__(self,parent):
        tk.Text.__init__(self, parent,
                           borderwidth = 3,
                           height = 500,
                         width = 85,
                         wrap = tk.WORD)
        self.parent = parent



class EntriesDisplayFrame(tk.Frame):
    """
    Containing frame for the text DisplayArea
    """
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, relief = tk.SUNKEN,
                          width = 200,
                          borderwidth = 2)
        self.parent = parent
        self.grid(row = 0, column = 0)

        self.entriesDisplayArea = EntriesDisplayArea(self)
        self.entriesDisplayArea.grid(row = 1, column = 0, sticky = 'ns')
        self.scrollVertical = tk.Scrollbar(self, orient = tk.VERTICAL,
                                           command = self.entriesDisplayArea.yview)


        self.entriesDisplayArea.config(yscrollcommand = self.scrollVertical.set)
        for i in range(1000):
            self.entriesDisplayArea.insert(tk.END,'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf')
        self.scrollVertical.grid(row=1,column=1,sticky = 'ns')

class ViewAllEntriesInDatabaseWindow(tk.Toplevel):
    """
    Window in which the user can view all of the entries entered ever
    entered into the database.
    """
    def __init__(self, parent = None):
        tk.Toplevel.__init__(self,parent,
                             height = 400,
                             width = 400)
        self.grid()
        self.entriesDisplayFrame = EntriesDisplayFrame(self)

if __name__ == '__main__':
    t0 = ViewAllEntriesInDatabaseWindow(None)

1 个答案:

答案 0 :(得分:2)

我认为您的问题存在是因为您的代码存在两个问题。一,您将文本小部件的高度设置为500.该值表示字符而不是像素,因此您将其设置为几千像素高。其次,您只需要插入一行文本,尽管文本长度为40,000个字符。如果您将高度设置为更合理的值,例如50而不是500,并在插入的数据中插入换行符,您将看到滚动条开始正常运行。

在不相关的注释中,self.grid() __init__ ViewAllEntriesInDatabaseWindow方法中对{{1}}的调用完全没用。您无法将小部件打包,放置或网格放入其他小部件中。

最后,我建议你将任何类构造函数调用网格(或打包或放置)本身 - 这将使您的代码难以维护。创建窗口小部件时,父窗口小部件应负责调用网格,打包或放置。否则,如果您决定重新组织窗口,则必须编辑每个子窗口小部件。