2017-03-27 19 views
0

我想創建一個可以檢查的字母列表,但是當列表關閉窗口時,我不知道如何讓滾動條工作。我已經讀過,你需要將標籤放入一個框架,然後放入一個畫布,但這不適合我。如何將標籤貼到Tkinter框架和帶滾動條功能的畫布上?

這裏是我的代碼:

import Tkinter as tk 

LARGE_FONT = ("Verdana", 12) 
NORMAL_FONT = ("Verdana", 10) 
SMALL_FONT = ("Verdana", 8) 

number_of_rows = 20 

def popupmsg(msg): 
    popup = tk.Tk() 
    popup.wm_title("!") 
    label = tk.Label(popup, text=msg, font=NORMAL_FONT) 
    label.pack(side="top", fill="x", pady=10) 
    B1 = tk.Button(popup, text="Okay", command=popup.destroy) 
    B1.pack() 
    popup.mainloop() 



class Window(tk.Tk): 

    def __init__(self, *args, **kwargs): 
    tk.Tk.__init__(self, *args, **kwargs) 
    master_frame = tk.Frame(self) 
    container = tk.Canvas(master_frame, height=300, width=720, scrollregion=(0,0,300,720)) 

    master_frame.pack(side="top", fill="both", expand=True) 

    vbar = tk.Scrollbar(container,orient="vertical") 
    vbar.grid(column=1, sticky="ns") 
    vbar.config(command=container.yview) 

    container.grid_rowconfigure(-0, weight=1) 
    container.grid_columnconfigure(-0, weight=1) 

    container.config(yscrollcommand=vbar.set) 
    container.pack(side="top", fill="both", expand=True) 
    #container.create_window(0,0,window=master_frame, anchor='nw') 

    child_to_container_frame = tk.Frame(container) 
    child_to_container_frame.grid_rowconfigure(-0, weight=1) 
    child_to_container_frame.grid_columnconfigure(-0, weight=1) 


    self.frames = {} 

    menubar = tk.Menu(master_frame) 
    filemenu = tk.Menu(menubar, tearoff=0) 
    filemenu.add_command(label="Help", command = lambda: popupmsg("Not supported yet")) 
    filemenu.add_separator() 
    filemenu.add_command(label="Exit", command=quit) 
    menubar.add_cascade(label="File", menu=filemenu) 
    optionmenu = tk.Menu(menubar, tearoff=0) 
    optionmenu.add_command(label="Option #1", command = lambda: popupmsg("You clicked option #1")) 
    optionmenu.add_command(label="Option #2", command = lambda: popupmsg("You clicked option #2")) 
    optionmenu.add_command(label="Option #3", command = lambda: popupmsg("You clicked option #3")) 
    menubar.add_cascade(label="Options", menu=optionmenu) 
    menubar.add_command(label="Start", command = lambda: popupmsg("Starting Scan")) 

    tk.Tk.config(self, menu=menubar) 

    frame = StartPage(child_to_container_frame, self) 
    self.frames[StartPage] = frame 
    frame.grid(row=0, column=0, sticky="nsew") 
    self.show_frame(StartPage) 



    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.PlaceLabels() 

    def PlaceLabels(self): 
     self.row = [] 
     self.checkboxrow = [] 
     self.text_in_row = [] 
     self.states = [] 
     letter = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"] 
     for i in range(number_of_rows): 
      self.states.append(tk.IntVar()) 
      self.row.append(tk.Label(self, bg="white", pady=5, font=(None, 1), height=20, width=720)) 
      self.row[i].grid(row=i, column=0, sticky="ew", padx=3, pady=5) 
      self.checkboxrow.append(tk.Checkbutton(self, bg="white", variable=self.states[i], command= lambda: self.DarkenLabel())) 
      self.checkboxrow[i].grid(row=i, column=0, sticky="w", padx=10) 
      self.text_in_row.append(tk.Label(self, bg="white", text=letter[i])) 
      self.text_in_row[i].grid(row=i, column=0) 

    def DarkenLabel(self): 
     for i in range(len(self.checkboxrow)): 
      if self.states[i].get() == 1: 
       self.row[i].config(bg="gray") 
       self.checkboxrow[i].config(bg="gray") 
       self.text_in_row[i].config(bg="gray") 
      else: 
       self.row[i].config(bg="white") 
       self.checkboxrow[i].config(bg="white") 
       self.text_in_row[i].config(bg="white")     


app = Window() 
app.geometry('733x500') 
app.mainloop() 

我認爲這個問題是某處Windows類的開始,但我不知道。

我曾嘗試: container.pack(side="top", fill="both", expand=True)container.create_window(0,0,window=master_frame, anchor='nw') 但兩人都沒有爲我工作。

有什麼建議嗎? 並感謝您的幫助

+1

的第一步是除了一個畫布,一個幀,標籤從代碼中刪除所有內容。由於您在理解代碼時遇到困難,代碼越少,理解起來就越容易。一旦你這樣做,並理解如何使簡單的案例工作,那麼你可以解決它與你的程序整合的問題。你可以保留'StartPage',但刪除除了導入,根窗口和最後三行之外的其他所有內容, –

+0

好吧我會盡力感謝你的建議 –

回答

0

我跟着布萊恩奧克利的建議從他的評論,它真的幫我解決了這個問題。這裏是我的代碼,只有梗概:

import Tkinter as tk 


class Window(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     master_frame = tk.Frame(self) 
     master_frame.pack(side="top", fill="both", expand=True) 

     vbar = tk.Scrollbar(master_frame) 
     vbar.pack(side='right',fill="y") 

     container = tk.Canvas(master_frame, height=300, width=720, scrollregion=(0,0,300,720))     
     container.pack(side="top", fill="both", expand=True) 

     child_to_container_frame = tk.Frame(container) 
     container.create_window(0,0,window=child_to_container_frame, anchor='nw')   

     vbar.config(command=container.yview) 
     container.config(yscrollcommand=vbar.set, scrollregion=(0,0,1000,1500)) 

     self.frames = {} 
     frame = StartPage(child_to_container_frame, self) 
     self.frames[StartPage] = frame 
     frame.grid(row=0, column=0, sticky="nsew") 
     self.show_frame(StartPage) 

    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.row = [] 
     self.row.append(tk.Label(self, bg="white", pady=5, font=(None, 1), height=20, width=720)) 
     self.row[0].grid(row=0, column=0, sticky="ew", padx=3, pady=5)   


app = Window() 
app.geometry('733x500') 
app.mainloop() 
相關問題