2015-08-01 4 views
1

У меня было требование для создания динамических кнопок в окне tkinter, но я попробовал параметр полосы прокрутки, который не помогает мне прокручивать кнопки в окне tkinter, есть ли другой способ прокрутки Динамические кнопки.Динамическая кнопка с ScrollBar в tkinter - Python

Код:

root = tkinter.Tk() 
root.title("Links-Shortcut") 
root.configure(background="gray99") 
sw= tkinter.Scrollbar(root) 
sw.pack(side=RIGHT, fill=Y) 


os.chdir("C:\Bo_Link") 
with open('Bo_ol_links.csv', 'r', newline='') as fo: 
    lis=[line.strip('\r\n').split(',') for line in fo]  # create a list of lists 
lis=sorted(lis) 
    #print (lis) 

for i,x in enumerate(lis): 
    btn = tkinter.Button(root,height=1, width=20,relief=tkinter.FLAT,bg="gray99",fg="purple3",font="Dosis",text=lis[i][0],command=lambda i=i,x=x: openlink(i)) 
    btn.pack(padx=10,pady=5,side=tkinter.TOP) 

def openlink(i): 
    os.startfile(lis[i][1]) 

root.mainloop() 

Спасибо.

+1

Это сделало бы его _lot_ проще для людей, чтобы помочь вам, если вы вывесили небольшой пример программу, которая фокусируется на динамическую кнопках проблемы. См. [MCVE]. –

+0

Это * много * лучше, хотя вы не указали инструкции 'import', и другим не легко запускать ваш код, поскольку у нас нет« C: \ Bo_Link »или« Bo_ol_links.csv ». –

ответ

2

Этот код устанавливает кнопки в прокручиваемую рамку, которую я украл у , найденный на Tkinter Unpythonic Wiki. Я запускаю его на Python 2, поэтому я использую Tkinter в качестве имени модуля в операторе import, поскольку Python 3 меняет этот оператор на использование tkinter.

import Tkinter as tk 

class VerticalScrolledFrame(tk.Frame): 
    """A pure Tkinter scrollable frame that actually works! 

    * Use the 'interior' attribute to place widgets inside the scrollable frame 
    * Construct and pack/place/grid normally 
    * This frame only allows vertical scrolling 
    """ 
    def __init__(self, parent, *args, **kw): 
     tk.Frame.__init__(self, parent, *args, **kw)    

     # create a canvas object and a vertical scrollbar for scrolling it 
     vscrollbar = tk.Scrollbar(self, orient=tk.VERTICAL) 
     vscrollbar.pack(fill=tk.Y, side=tk.RIGHT, expand=tk.FALSE) 
     canvas = tk.Canvas(self, bd=0, highlightthickness=0, 
         yscrollcommand=vscrollbar.set) 
     canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=tk.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 = tk.Frame(canvas) 
     interior_id = canvas.create_window(0, 0, window=interior, 
              anchor=tk.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) 


root = tk.Tk() 
root.title("Scrollable Frame Demo") 
root.configure(background="gray99") 

scframe = VerticalScrolledFrame(root) 
scframe.pack() 

lis = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ') 
for i, x in enumerate(lis): 
    btn = tk.Button(scframe.interior, height=1, width=20, relief=tk.FLAT, 
     bg="gray99", fg="purple3", 
     font="Dosis", text='Button ' + lis[i], 
     command=lambda i=i,x=x: openlink(i)) 
    btn.pack(padx=10, pady=5, side=tk.TOP) 

def openlink(i): 
    print lis[i] 

root.mainloop() 
+0

Спасибо ... работает как шарм ;-) – Sivasankaran

1

Верьте или нет, самым простым решением для вертикального стека кнопок может быть добавление кнопок в текстовый виджет. Вы можете сделать frame-in-a-canvas solution, что дает большую гибкость, но это немного больше работы. Использование текстового виджета в качестве контейнера не дает большой гибкости в отношении макета, но очень просто, если вам нужен вертикальный стек виджетов.

Вот рабочий пример:

import Tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     text = tk.Text(self, wrap="none") 
     vsb = tk.Scrollbar(orient="vertical", command=text.yview) 
     text.configure(yscrollcommand=vsb.set) 
     vsb.pack(side="right", fill="y") 
     text.pack(fill="both", expand=True) 

     for i in range(20): 
      b = tk.Button(self, text="Button #%s" % i) 
      text.window_create("end", window=b) 
      text.insert("end", "\n") 

     text.configure(state="disabled") 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop()