Skip to main content
 首页 » 编程设计

python之为什么我的 tkinter 滚动条不工作

2025年05月04日13luoye11

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

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 的新手,所以如果我做的其他事情有误,请告诉我。感谢您的帮助!

请您参考如下方法:

为了让您的代码以最少的修改工作, 改变

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

到

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

并移除

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

我从 this example 开始发现了这一点然后将其修改为看起来更像您的代码。因为我是逐步修改它的,所以我总是有一个工作的可滚动 Canvas 。当 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()