2015-11-08 207 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:我想你誤解了網格是如何工作的。每一行都獨立於其他行。你可以有三行,每一行都有不同的高度。如果你跨越一行沒有任何東西的行,那行高度爲零。 –