#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 для виджетов.
Спасибо вам всем!