我正在使用tkinter在python中创建一个json编辑器。
通过创建一个Canvas
并在其中放置一个Frame
,我添加了一个滚动条。
然后,我将Scrollbar
命令设置为canvas.yview。
有两件事搞砸了,我不知道为什么。
这是我的代码:
EDIT>码缩短
import Tkinter as tk
import webbrowser
import os
import bjson as bj
class App:
def __init__(self, master):
self.window = master
self.window.geometry("800x450")
self.canvas = tk.Canvas(self.window, width=800, height=400)
self.master = tk.Frame(self.canvas, width=800, height=400)
self.canvas.pack()
self.master.place(x=0, y=0)
scrollbar = tk.Scrollbar(self.window)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar.config(command=self.canvas.yview)
def init(self):
master = self.master
self.frames = {
"Home": HomeFrame(master)
}
self.openFrame = None
self.loadFrame("Home")
def loadFrame(self, frame):
self.openFrame = self.frames[frame]
self.openFrame.display()
def setTitle(self, t):
self.window.title(t)
class Frame:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(master)
self.frame.grid(row=0, column=0, sticky='news')
self.init()
self.frame_create()
def display(self):
self.frame.tkraise() #raises frame to top
self.frame_load() #initializes the frame
def clear(self):
for widget in self.frame.winfo_children():
widget.destroy()
def init(self): pass
def frame_load(self): pass
def frame_create(self): pass
class HomeFrame(Frame):
def frame_create(self):
p = self.frame
for i in range(20):
tk.Label(p, text="This is content... " + str(i)).pack()
for j in range(2):
LineBreak(p)
def LineBreak(p):
tk.Label(p, text="").pack()
root = tk.Tk()
glob = {}
app = App(root)
app.init()
root.mainloop()
它有点长,也有点混乱,但是您应该看看我是如何在__init__
of App
中添加滚动条的。
有人知道这是怎么回事吗?怎么解决?
提前感谢!
发布于 2016-11-27 21:33:19
您的代码有很多错误。但是,滚动条不能正常工作的问题与您忽略做的两件事有关:
首先,滚动条和小部件需要双向通信。画布需要被告知关于滚动条,而滚动条需要被告知关于画布。你做的是一个,而不是另一个:
self.canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.configure(command=self.canvas.yview)
其次,您需要配置画布的scrollregion
属性。这告诉tkinter您想要查看更大的虚拟画布的哪个部分。通常,这是在画布的<Configure>
方法的绑定中完成的,通常您希望将其设置为画布中所有内容的边界框。对于后者,可以将字符串"all"
传递给bbox
方法:
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
如果您知道要滚动的区域的确切大小,可以简单地将其设置为该值(例如:scrollregion=(0,0,1000,1000)
在1000x1000像素的区域内滚动)。
第2点的原因是不能将pack
和grid
同时用于共享同一个父部件的小部件。当你这样做的时候,你会得到你描述的行为。这是因为grid
将尝试布局所有的小部件。这可能会导致一些小部件更改大小。pack
将注意到一个或多个小部件大小的变化,并尝试重新布局所有的小部件。这可能会导致一些小部件更改大小。grid
将注意到一个或多个小部件大小的变化,并尝试重新布局所有的小部件。诸若此类。
https://stackoverflow.com/questions/40832835
复制相似问题