Полоса прокрутки и строка поиска в tkinter

#python #tkinter #canvas

#python #tkinter #холст

Вопрос:

 listacsv = os.path.abspath("spiders//")

game = tk.Tk()
game.geometry("1000x650")
game.title('test')
game.resizable(0,0)

entry = tk.Entry(game)
entry.pack(side="left", ipady=5, ipadx=65, anchor='nw', padx=10, pady=10)

frame1 = tk.Frame(game)
frame1.pack(side='right', padx=5)
canvas = tk.Canvas(frame1,width=500,height=700,scrollregion=(100,120,5000,5000))
vbar=tk.Scrollbar(frame1,orient='vertical')
vbar.pack(side='right',fill='y')
vbar.config(command=canvas.yview)
canvas.config(width=500,height=700)
canvas.config(yscrollcommand=vbar.set)
canvas.pack(side='right',expand=True,fill='both')

tk.Button(game, text='Options',activebackground='#87a0c7',relief='solid', command='', height = 2, width = 10).place(x=5, y=600) 

with open(listacsv   '/list.csv', newline='', encoding="utf8") as f:
    reader = csv.reader(f)
    next(f)
    data = list(reader)

c = 4
r = math.ceil(len(data)/c)
for i, item in enumerate(data):
    onclick = lambda url=item[0]: webbrowser.open(url)
    tk.Button(canvas, text=item[1], command=onclick, activebackground='#87a0c7',relief='sunken', height = 3, width = 19, padx=10).grid(column=i//r, row=i%r)      


verlabel=tk.Label(game, text='Version: '  currentver, relief='flat')
verlabel.place(x=125, y=619)
game.mainloop() 
  

Я вижу полосу прокрутки, но она не влияет на фрейм, кнопки не перемещаются.

Есть идеи о том, как показывать только те кнопки, в тексте которых есть слова, написанные в строке поиска?

Заранее спасибо!

Комментарии:

1. Вам нужно создать еще один фрейм и использовать его canvas canvas.create_window(...) . Затем сделайте все кнопки дочерними элементами этого фрейма.

Ответ №1:

Проблема в том, что вы разместили свою кнопку в окне игры, а полосу прокрутки в frame1. Убедитесь, что кнопка и полоса прокрутки расположены в одном и том же месте. Если вы хотите, чтобы что-то еще было в frame1, измените его. После того, как они совпадут, ваш код будет выглядеть следующим образом:

 listacsv = os.path.abspath("spiders//")

game = tk.Tk()
game.geometry("1000x650")
game.title('test')
game.resizable(0,0)

entry = tk.Entry(game)
entry.pack(side="left", ipady=5, ipadx=65, anchor='nw', padx=10, pady=10)

frame1 = tk.Frame(game)
frame1.pack(side='right', padx=5)
canvas = tk.Canvas(frame1,width=500,height=700,scrollregion=(100,120,5000,5000))
vbar=tk.Scrollbar(frame1,orient='vertical')
vbar.pack(side='right',fill='y')
vbar.config(command=canvas.yview)
canvas.config(width=500,height=700)
canvas.config(yscrollcommand=vbar.set)
canvas.pack(side='right',expand=True,fill='both')

tk.Button(frame1, text='Options',activebackground='#87a0c7',relief='solid', command='', height = 2, width = 10).place(x=5, y=600) 

with open(listacsv   '/list.csv', newline='', encoding="utf8") as f:
    reader = csv.reader(f)
    next(f)
    data = list(reader)

c = 4
r = math.ceil(len(data)/c)
for i, item in enumerate(data):
    onclick = lambda url=item[0]: webbrowser.open(url)
    tk.Button(canvas, text=item[1], command=onclick, activebackground='#87a0c7',relief='sunken', height = 3, width = 19, padx=10).grid(column=i//r, row=i%r)      


verlabel=tk.Label(frame1, text='Version: '  currentver, relief='flat')
verlabel.place(x=125, y=619)
game.mainloop()
  

Комментарии:

1. Параметры метки и кнопки должны находиться за пределами рамки, кнопки, которые я хочу прокручивать, являются tk. Кнопка (холст, текст = элемент [1], command = onclick, activebackground =’#87a0c7′, рельеф = ‘утопленный’, высота = 3, ширина = 19, padx = 10).сетка (столбец = i // r, строка = i%r) ‘

2. Затем также поместите свою полосу прокрутки на экран игры. Тогда не помещайте полосу прокрутки во фрейм.

3. Но у меня есть все кнопки в рамке, почему я должен поместить полосу прокрутки в игру?

4. Если вы хотите, чтобы полоса прокрутки работала, это то, что я бы сделал…

Ответ №2:

Хорошо, я справился, как это сделать, приняв во внимание ответы, я публикую код на случай, если кто-то столкнулся с такой же проблемой.

 frame1 = tk.Frame(game)
frame1.pack(side='right', padx=0)
canvas = tk.Canvas(frame1,width=660,height=700)
canvas.pack(side='right',expand=True)
my_scrollbar = ttk.Scrollbar(frame1, orient='vertical', command=canvas.yview)
my_scrollbar.pack(side='right', fill='y') 
my_scrollbar.place(x=645,relheight='1')

canvas.configure(yscrollcommand=my_scrollbar.set)
canvas.bind("<Configure>", lambda e: canvas.configure(scrollregion = canvas.bbox("all")))
second_frame = tk.Frame(canvas)

canvas.create_window((0,0), window=second_frame, anchor='ne')
  

А затем использовал second_frame для виджетов.
Спасибо вам всем!