简体   繁体   English

Tkinter的; 如何在主根窗口中按下按钮时打开的弹出/顶级窗口中使用滚动条

[英]Tkinter; how to use scrollbar in a popup/top-level window that opens when a button is pressed in main root window

I'm trying to create an app with a scrollbar in a top level window that opens when a button,bttn, is pressed in the main root window and from the code below I'd need help with the following: 我正在尝试在顶层窗口中创建带有滚动条的应用程序,当在主根窗口中按下按钮bttn时,该窗口会打开,并且从下面的代码中我需要以下帮助:

  • the scrollbar should be in a new, top-level, window from the main root window by pressing the button bttn defined in widget() 通过按在widget()中定义的按钮bttn,滚动条应该位于主根窗口的新的顶层窗口中
  • the new popup window should contain the scrollbar vscrollbar defined in VerticalScrollFrame 新的弹出窗口应包含在VerticalScrollFrame中定义的滚动条vscrollbar
  • the scrollbar vscrollbar shouldn't appear in the main root window, only in the new popup window 滚动条vscrollbar不应出现在主根窗口中,而应出现在新的弹出窗口中

     from Tkinter import * class VerticalScrolledFrame(Frame): def __init__(self, parent, *args, **kw): Frame.__init__(self, parent, *args, **kw) # create a canvas object and a vertical scrollbar for scrolling it vscrollbar = Scrollbar(self, orient=VERTICAL) vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE) canvas = Canvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set) canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) vscrollbar.config(command=canvas.yview) # reset the view canvas.xview_moveto(0) canvas.yview_moveto(0) # create a frame inside the canvas which will be scrolled with it self.interior = interior = Frame(canvas) interior_id = canvas.create_window(0, 0, window=interior, anchor=NW) # track changes to the canvas and frame width and sync them, # also updating the scrollbar def _configure_interior(event): # update the scrollbars to match the size of the inner frame size = (interior.winfo_reqwidth(), interior.winfo_reqheight()) canvas.config(scrollregion="0 0 %s %s" % size) if interior.winfo_reqwidth() != canvas.winfo_width(): # update the canvas's width to fit the inner frame canvas.config(width=interior.winfo_reqwidth()) interior.bind('<Configure>', _configure_interior) def _configure_canvas(event): if interior.winfo_reqwidth() != canvas.winfo_width(): # update the inner frame's width to fill the canvas canvas.itemconfigure(interior_id, width=canvas.winfo_width()) canvas.bind('<Configure>', _configure_canvas) if __name__ == "__main__": class SampleApp(Frame): def __init__(self,root, *args, **kwargs): Frame.__init__(self, root,*args, **kwargs) self.frame = VerticalScrolledFrame(root) self.frame.pack() self.widget() def widget(self): self.label = Label(text="Shrink the window to activate the scrollbar.") self.label.pack() bttn = Button(self.frame.interior, text = "Flytta fram/bak i listvy", command = self.open_new_window_with_text_and_scrollbar) bttn.pack() # Should be opened in a new, top-level, window from the main root window by pressing the #button bttn defined in widget() # the new popup window should contain the scrollbar vscrollbar defined in SampleApp # the scrollbar vscrollbar shouldn't appear in the main root window, only in the new #popup window def open_new_window_with_text_and_scrollbar(self): self.top = tk.Toplevel(self) frame = VerticalScrolledFrame(root) frame.pack() Button = tk.Button(self.top, text="Close window", command=self.top.destroy) Label = tk.Label(self.top, wraplength = 500,text="testing") Label.pack(side="left", fill="both", expand=True) Button.pack() root = tk.Tk() root.title("Maltparser1.0_demo") root.geometry("900x700") app = SampleApp(root) root.mainloop() 

You're passing root as the parent to VerticalScrolledFrame , you need to pass self.top instead: 您要将root作为父级传递给VerticalScrolledFrame ,而需要传递self.top

class SampleApp(Frame):

     # ...Other code...

     def open_new_window_with_text_and_scrollbar(self):
        self.top = tk.Toplevel(self)
        frame = VerticalScrolledFrame(self.top)
        frame.pack()
        # Other widgets

That's why it's adding itself to the main root window instead of the Toplevel . 这就是为什么它将自身添加到主根窗口而不是Toplevel

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM