2015-11-08 156 views
0

我在画布中添加了画布和滚动条。 但是有些东西错误导致滚动条关闭(底部底部不可见),我绘制的文本关闭。任何人都可以告诉我最新的问题?我想在画布上,填补了整个帧(显然没有滚动条)使用tkinter画布的画布布局

import sys 
import os 

if sys.version_info[0] < 3: 
    import Tkinter as tk 
    import ttk as ttk 
else: 
    import tkinter as tk 
    import tkinter.ttk as ttk 

# 
# LeftMiddle 
# 
class LeftMiddle(tk.Frame): 
    def __init__(self, master=None): 
     self.parent = master 
     tk.Frame.__init__(self, self.parent, bg='bisque', borderwidth=1, relief="sunken") 
     self.__create_layout() 
     self.draw_text() 

    def __create_layout(self): 
     self.canvas = tk.Canvas(self, bg="green", relief=tk.SUNKEN) 
     self.canvas.config(width=20, height=10) 
     self.canvas.config(highlightthickness=0) 

     self.sbar = tk.Scrollbar(self, orient=tk.VERTICAL) 

     self.sbar.pack(side=tk.RIGHT, fill=tk.Y) 
     self.canvas.pack(side=tk.LEFT, expand="YES", fill=tk.BOTH) 

    def draw_text(self):  
     self.canvas.create_text(0, 0, text='1234567890', fill='red') 
     self.canvas.create_text(0, 25, text='ABCDEFGH', fill='blue') 

# 
# MainWindow 
# 
class MainWindow(tk.Frame): 
    def __init__(self, master=None): 
     self.parent = master 
     tk.Frame.__init__(self, self.parent, bg='bisque', borderwidth=1, relief="sunken") 
     self.__create_layout() 

    def __create_layout(self): 
     self.frame1 = tk.Frame(self, bg="yellow") 
     self.frame2 = tk.Frame(self, bg="blue") 
     self.frame3 = LeftMiddle(self) # tk.Frame(self, bg="green") 
     self.frame4 = tk.Frame(self, bg="brown") 
     self.frame5 = tk.Frame(self, bg="pink") 

     self.frame1.grid(row=0, column=0, rowspan=4, columnspan=8, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame2.grid(row=0, column=8, rowspan=4, columnspan=2, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame3.grid(row=4, column=0, rowspan=2, columnspan=5, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame4.grid(row=4, column=5, rowspan=2, columnspan=5, sticky=(tk.N, tk.S, tk.W, tk.E)) 
     self.frame5.grid(row=5, column=0, rowspan=1, columnspan=10, sticky=(tk.N, tk.S, tk.W, tk.E)) 

     for r in range(6): 
      self.rowconfigure(r, weight=1) 
     for c in range(10): 
      self.columnconfigure(c, weight=1) 
# 
# MAIN 
# 
def main(): 
    root = tk.Tk() 

    root.title("Frames") 
    root.geometry("550x300+525+300") 

    root.configure(background="#808080") 
    root.option_add("*font", ("Courier New", 9, "normal")) 

    window = MainWindow(master=root) 
    window.pack(side="top", fill="both", expand=True) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

enter image description here

回答

1

您有重叠的帧。 self.frame3self.frame4都在行4中,行跨度为2,这意味着它们占据行4和行5. self.frame5也在行5中。因此,self.frame5掩盖了包含画布的框架的下半部分self.frame3

我不明白你为什么有这么多的rowspans,他们似乎完全没有必要的,除非你有你为什么要多个行和列,但只有跨越这些行和列单框的一些具体原因。看看截图,我看到只需要三行。

文字看起来不对的原因是默认情况下,文本居中在您给出的坐标上。您可能需要查看create_text方法的anchor选项。

+0

非常感谢!我有5行,因为我需要框架'黄色'和'蓝色'比其余rowspan = 4更大。有三排他们会有相同的尺寸,我不想那样。 – krusty

+0

我刚刚意识到我可以使用rowconfigure weight来实现同样的只有三行,它更易于阅读。谢谢! – krusty

+0

@krusty:我想你误解了网格是如何工作的。每一行都独立于其他行。你可以有三行,每一行都有不同的高度。如果你跨越一行没有任何东西的行,那行高度为零。 –