[英]Python Tkinter: adding a scrollbar to frame within a canvas
我對Tkinter很新,但是,盡管如此,我被要求“創建”一個簡單的表單,用戶可以提供有關其工作狀態的信息(這是我常用工作的一個側面項目)。 因為我需要有相當多的文本小部件(用戶需要提供有關文檔狀態的評論,或者到目前為止打開問題),我希望有一些“可滾動”(沿着y軸)。
我瀏覽了周圍尋找解決方案,經過一些試驗和錯誤,我發現了一些非常好的東西。 基本上我創建一個畫布,並在畫布內有一個滾動條和一個框架。 在框架內,我有我需要的所有小部件。
這是代碼的snipet(只有一些實際的小部件,特別是文本小部件):
from Tkinter import *
## My frame for form
class simpleform_ap(Tk):
# constructor
def __init__(self,parent):
Tk.__init__(self,parent)
self.parent = parent
self.initialize()
#
def initialize(self):
#
self.grid_columnconfigure(0,weight=1)
self.grid_rowconfigure(0,weight=1)
#
self.canvas=Canvas(self.parent)
self.canvas.grid(row=0,column=0,sticky='nsew')
#
self.yscrollbar = Scrollbar(self,orient=VERTICAL)
self.yscrollbar.grid(column =4, sticky="ns")
#
self.yscrollbar.config(command=self.canvas.yview)
self.yscrollbar.pack(size=RIGTH,expand=FALSE)
#
self.canvas.config(yscrollcommand=self.yscrollbar.set)
self.canvas.pack(side=LEFT,expand=TRUE,fill=BOTH)
#
self.frame1 = Frame(self.canvas)
self.canvas.create_window(0,0,window=self.frame1,anchor='nw')
# Various Widget
# Block Part
# Label
self.labelVariableIP = StringVar() # Label variable
labelIP=Label(self.frame1,textvariable=self.labelVariableIP,
anchor="w",
fg="Black")
labelIP.grid(column=0,row=0,columnspan=1,sticky='EW')
self.labelVariableIP.set(u"IP: ")
# Entry: Single line of text!!!!
self.entryVariableIP =StringVar() # variable for entry field
self.entryIP =Entry(self.frame1,
textvariable=self.entryVariableIP,bg="White")
self.entryIP.grid(column = 1, row= 0, sticky='EW')
self.entryVariableIP.set(u"IP")
# Update Button or Enter
button1=Button(self.frame1, text=u"Update",
command=self.OnButtonClickIP)
button1.grid(column=2, row=0)
self.entryIP.bind("<Return>", self.OnPressEnterIP)
#...
# Other widget here
#
# Some Text
# Label
self.labelVariableText = StringVar() # Label variable
labelText=Label(self.frame1,textvariable=
self.labelVariableText,
anchor="nw",
fg="Black")
labelText.grid(column=0,row=curr_row,columnspan=1,sticky='EW')
self.labelVariableTexta.set(u"Insert some texts: ")
# Text
textState = TRUE
self.TextVar=StringVar()
self.mytext=Text(self.frame1,state=textState,
height = text_height, width = 10,
fg="black",bg="white")
#
self.mytext.grid(column=1, row=curr_row+4, columnspan=2, sticky='EW')
self.mytext.insert('1.0',"Insert your text")
#
# other text widget here
#
self.update()
self.geometry(self.geometry() )
self.frame1.update_idletasks()
self.canvas.config(scrollregion=(0,0,
self.frame1.winfo_width(),
self.frame1.winfo_height()))
#
def release_block(argv):
# Create Form
form = simpleform_ap(None)
form.title('Release Information')
#
form.mainloop()
#
if __name__ == "__main__":
release_block(sys.argv)
正如我之前提到的,這個腳本完全可以完成工作,即使它有一些不是“基本”但有點煩人的小問題。
當我啟動它時,我得到了這個(對於糟糕的屏幕捕獲感到抱歉): 在此處輸入圖像描述
可以看出,它只顯示網格的第一個“列”,而我想擁有它們(在我的情況下它們應該是4)要查看所有字段,我必須手動調整大小(使用鼠標)窗口。 我想要的是這樣的(所有4列都在那里): 在這里輸入圖像描述
此外,滾動條不會在整個窗體上延伸,但它只是在窗口的右下角。
雖然后一個問題(滾動條)我可以隨身攜帶,但第一個問題更重要一點,因為我希望最終用戶能夠在不需要調整窗口大小的情況下獲得他們應該做的“圖片”。
有什么想法我應該如何處理這個? 我錯過了什么?
在此先感謝您的幫助
在類的__init__
方法中,您似乎沒有設置主窗口的大小。 你應該這樣做,或者它只是將窗口設置為默認大小,它只顯示它可以的任何東西,在你的情況下,只有1列。 因此,在__init__
方法中,嘗試將self.geometry(str(your_width) + "x" + str(your_height))
放在其中your_width
和your_height
是您選擇的任何整數,以便您在窗口中查看所需內容。
至於你的滾動條問題,我所要做的就是將滾動條添加到畫布的方式改為.pack()
,並將屬性fill = 'y' and side = RIGHT
到它,如下所示:
self.yscrollbar.pack(side = 'right', fill = 'y')
此外,您不需要:
self.yscrollbar.config(command=self.canvas.yview)
self.yscrollbar.pack(size=RIGHT,expand=FALSE)
只需將命令選項添加到滾動條的創建中,如下所示:
self.scrollbar = Scrollbar(self,orient=VERTICAL,command=self.canvas.yview)
總之,以下更改應使您的代碼按預期工作:
加:
def __init__(self,parent): Tk.__init__(self,parent) self.parent = parent self.initialize() # Resize the window from the default size to make your widgets fit. Experiment to see what is best for you. your_width = # An integer of your choosing your_height = # An integer of your choosing self.geometry(str(your_width) + "x" + str(your_height))
添加和編輯:
# Add `command=self.canvas.yview` self.yscrollbar = Scrollbar(self,orient=VERTICAL,command=self.canvas.yview) # Use `.pack` instead of `.grid` self.yscrollbar.pack(side = 'right', fill = 'y')
去掉:
self.yscrollbar.config(command=self.canvas.yview) self.yscrollbar.pack(size=RIGHT,expand=FALSE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.