为什么我的tkinter滚动条不起作用?

时间:2013-07-27 02:19:09

标签: python python-2.7 tkinter tk ttk

我在笔记本小部件中有3个标签,我想在第3个标签上有一个可滚动的框架。我设置了一个画布和一个滚动条,并设置所有命令让它们进行交互,但它不起作用。我究竟做错了什么?完整的可运行代码如下:

import subprocess
from Tkinter import *
from ttk import *
import piper as Piper
import sqlite3



def confCanvas(event):
    global viewKeysCanvas
    print "ConfCanvasEvent\n";
    viewKeysCanvas.configure(scrollregion=viewKeysCanvas.bbox("all"))



root =Tk()

sizex = 800
sizey = 500
posx  = 100
posy  = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

root.title('Scroll Test')

note = Notebook(root)

tab1 = Frame(note)
tab2 = Frame(note)
tab3 = Frame(note)

tab1.pack()
tab2.pack()
tab3.pack(fill=BOTH, expand=True)



#tab1
printGroup = Frame(tab1)
Label(printGroup, text="Test label1").pack()
printGroup.pack()

#tab2
bulkGroup = Frame(tab2)
Label(bulkGroup, text="Test label2").pack()
bulkGroup.pack()


#tab3
vkFrame = Frame(tab3)
viewKeysCanvas = Canvas(vkFrame)
viewKeysGroup = Frame(viewKeysCanvas)
viewKeysScrollbar = Scrollbar(vkFrame, orient="vertical", command=viewKeysCanvas.yview)
viewKeysCanvas.configure(yscrollcommand=viewKeysScrollbar.set)

viewKeysScrollbar.pack(side=RIGHT, fill=Y)
viewKeysCanvas.pack(fill="both", expand=True)
viewKeysCanvas.create_window((0,0), window=tab3)
vkFrame.bind("<Configure>",confCanvas)
vkFrame.pack()

for x in range(0, 9):
    aKeyGroup = LabelFrame(viewKeysGroup, text="number: "+str(x))
    buttonFrame = Frame(aKeyGroup)
    Button(buttonFrame, text="Action 1").pack(padx=10, side=LEFT)
    Button(buttonFrame, text="Action 2").pack(padx=10, side=LEFT)
    Label(aKeyGroup, text="Public key: ").pack(side=TOP)
    Label(aKeyGroup, text="Private key: ").pack(side=TOP)
    buttonFrame.pack(padx=10, pady=10)      
    aKeyGroup.pack()



viewKeysGroup.pack(padx=10, pady=10)


note.add(tab1, text = "Test tab 1")
note.add(tab2, text = "Test tab 2")
note.add(tab3, text = "Test tab 3")


note.pack(expand=True, fill=BOTH)


root.mainloop()

我正在使用LXDE在Debian上使用Python 2.7.3。我是一名经验丰富的程序员,但我是Python的新手,所以如果我做的其他事情错了,请告诉我。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

要使代码能够以最少量的修改工作, 变化

viewKeysCanvas.create_window((0,0), window=tab3)

viewKeysCanvas.create_window((0,0), window=viewKeysGroup)

并删除

# viewKeysGroup.pack(padx=10, pady=10)

我从this example开始,然后将其修改为更像您的代码,从而发现了这一点。因为我逐渐修改它,所以我总是有一个可滚动的画布。当GUI看起来大致相同时,我只是简单地比较了不同的行。下面是我最终得到的代码。

对不起,我无法解释为什么这些变化是必要的。我认为将tab3更改为viewKeysGroup似乎是合理的,但为什么你应该避免打包viewKeysGroup超出我的范围。


import Tkinter as tk
import ttk

class Tab1(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        tk.Label(self, text="Test label1").pack()

class Tab2(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        tk.Label(self, text="Test label2").pack()

class Tab3(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.viewKeysCanvas = tk.Canvas(self)
        self.viewKeysGroup = tk.Frame(self.viewKeysCanvas)
        self.viewKeysScrollbar = tk.Scrollbar(self, orient="vertical",
                                command=self.viewKeysCanvas.yview)
        self.viewKeysCanvas.configure(yscrollcommand=self.viewKeysScrollbar.set)
        self.viewKeysScrollbar.pack(side="right", fill="y")
        self.viewKeysCanvas.pack(fill="both", expand=True)
        self.viewKeysCanvas.create_window(0, 0, window=self.viewKeysGroup, anchor="nw")
        self.viewKeysGroup.bind("<Configure>", self.on_frame_configure)
        self.populate()

    def populate(self):
        for x in range(0, 9):
            aKeyGroup = tk.LabelFrame(self.viewKeysGroup, text="number: " + str(x))
            buttonFrame = tk.Frame(aKeyGroup)
            tk.Button(buttonFrame, text="Action 1").pack(padx=10, side="left")
            tk.Button(buttonFrame, text="Action 2").pack(padx=10, side="left")
            tk.Label(aKeyGroup, text="Public key: ").pack(side="top")
            tk.Label(aKeyGroup, text="Private key: ").pack(side="top")
            buttonFrame.pack(padx=10, pady=10)
            aKeyGroup.pack()

    def on_frame_configure(self, event):
        """Reset the scroll region to encompass the inner frame"""
        self.viewKeysCanvas.configure(scrollregion=self.viewKeysCanvas.bbox("all"))

root = tk.Tk()
sizex, sizey, posx, posy = 800, 500, 100, 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
root.title('Scroll Test')

note = ttk.Notebook(root)
tab1 = Tab1(note)
tab2 = Tab2(note)
tab3 = Tab3(note)

note.add(tab1, text="Test tab 1")
note.add(tab2, text="Test tab 2")
note.add(tab3, text="Test tab 3")

note.pack(expand=True, fill="both")
root.mainloop()