2016-11-27 70 views
0

我在使用tkinter的python中创建json编辑器。滚动条无法在画布上工作

我已经添加了一个滚动条,通过创建一个Canvas,并在其中放置一个Frame

然后我将Scrollbar命令设置为canvas.yview。

这两件事搞砸了,我不知道为什么。

  1. 当我按下滚动按钮(向上和向下箭头)画布不滚动

  2. 我包装滚动条到窗口(根)现在代替帧,因为每当我将它包装到框架上,tkinter应用程序无法打开,并且我的电脑风扇开始启动...任何人都知道这里发生了什么? (因此,滚动条是微小的,如果你尝试运行的代码)

这里是我的代码:

编辑>代码缩短

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() 

这是一个有点长,有点混乱,但你应该看看我如何在App

__init__中添加滚动条任何人都有任何想法发生了什么上,以及如何解决它?

在此先感谢!

+0

请删除所有可能的代码,同时仍然提供一个展示不良行为的示例。请参阅[如何创建最小,完整和可验证示例](http://www.stackoverflow.com/help/mcve) –

+0

我已将代码更新为缩短版本,但仍存在相同问题。谢谢你的帮助。 –

回答

0

代码有很多错误。但是,滚动条无法正常工作的问题与您忽略的两件事有关:

首先,滚动条和小部件需要双向通信。画布需要被告知滚动条,滚动条需要被告知画布。你正在做的一个而不是其他:

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的原因是,您不能同时使用packgrid共享同一父项的小部件。当你这样做时,你会得到你描述的行为。这是因为grid将尝试布置所有的小部件。这可能会导致一些小部件更改大小。 pack会注意到一个或多个小部件大小的变化,并尝试重新布局所有小部件。这可能会导致一些小部件更改大小。grid会注意到一个或多个小部件大小的变化,并尝试重新布局所有小部件。等等。