這是我的代碼(如果太長,請見諒)。我想創建 1 個垂直滾動條。因為我有很多行,我把它放在滾動條中,所以我可以滾動查看 GUI 無法顯示的行。我嘗試使用 Scrollbar,但它只有 1 行。對不起,我的英語不好。有人能幫我嗎?
from tkinter import *
from tkinter import ttk
class LabelAndCombobox:
def __init__(self, tk_root, row, text_label, value_combobox):
# self.row = row
self.text_label = text_label
self.value_combobox = value_combobox
self.textvariable = StringVar()
# label text for combobox
self.label = ttk.Label(tk_root, text=self.text_label " ", font=("Times New Roman", 10), relief=RAISED).grid(column=0, row=row, padx=10, pady=5, sticky=W)
# combobox
self.combobox = ttk.Combobox(tk_root, width=50, textvariable=self.textvariable, values=self.value_combobox, state='readonly')
self.combobox.current(None)
self.combobox.unbind_class("TCombobox", "<MouseWheel>")
self.combobox.bind('<<ComboboxSelected>>', lambda event: self.changed(event))
self.combobox.grid(column=1, row=row, sticky=W)
def changed(self, event):
print(self.combobox.get())
if __name__ == '__main__':
a = ["?n u?ng", "?n u?ng > ?m th?c", "?n u?ng > ?m th?c > ?m th?c Hàn Qu?c", "?n u?ng > ?m th?c > ?m th?c Vi?t",
"?n u?ng > Cafe/N??c gi?i khát", "?n u?ng > Cafe/N??c gi?i khát > N??c hoa qu?", " sinh t?",
"?n u?ng > Cafe/N??c gi?i khát > Trà s?a", "?n u?ng > ?? u?ng", "?n u?ng > ?? u?ng có c?n",
"?n u?ng > ?? u?ng có c?n > Bia", "?n u?ng > ?? u?ng có c?n > R??u", "?n u?ng > Món ?n > ?n v?t",
"?n u?ng > Món ?n > Bánh > Bánh ?u", "?n u?ng > Món ?n > ??c s?n", "?n u?ng > Món ?n > Pizza",
"?n u?ng > Nhà hàng", "?n u?ng > Nhà hàng > Quán nh?u", "C?ng vi?c", "C?ng vi?c > D?ch v? ch?m sóc cá nhan",
"C?ng vi?c > D?ch v? ch?m sóc cá nhan > Nhan viên th?m m? vi?n", " spa", "C?ng vi?c > Giáo d?c",
"C?ng vi?c > Giáo d?c > Giáo d?c ti?u h?c", "C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Tr?c ??a", "C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng > Ki?n trúc dan d?ng",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng > K? s? xay d?ng", "C?ng vi?c > Ngh? thu?t bi?u di?n"]
b = ["?n u?ng", "?n u?ng > ?m th?c", "?n u?ng > ?m th?c > ?m th?c Hàn Qu?c", "?n u?ng > ?m th?c > ?m th?c Vi?t",
"?n u?ng > Cafe/N??c gi?i khát", "?n u?ng > Cafe/N??c gi?i khát > N??c hoa qu?, sinh t?"]
root = Tk()
root.geometry("600x700")
canvas = Canvas(root, height=700, width=600)
ybar = Scrollbar(root, orient=VERTICAL, command=canvas.yview)
ybar.grid()
canvas.config(yscrollcommand=ybar.set)
count = 1
for i in a:
# LabelAndCombobox(root, count, "check " str(count), b)
LabelAndCombobox(root, count, i, b)
count = 1
canvas.grid(rowspan=len(a), columnspan=2)
root.mainloop()
uj5u.com熱心網友回復:
你需要:
- 在畫布內創建一個框架并將這些標簽和組合框放入此框架
scrollregion調整框架大小時更新畫布
import tkinter as tk
from tkinter import ttk
class LabelAndCombobox:
def __init__(self, tk_root, row, text_label, value_combobox):
# self.row = row
self.text_label = text_label
self.value_combobox = value_combobox
self.textvariable = tk.StringVar()
# label text for combobox
self.label = ttk.Label(tk_root, text=self.text_label " ", font=("Times New Roman", 10), relief=tk.RAISED)
self.label.grid(column=0, row=row, padx=10, pady=5, sticky=tk.W)
# combobox
self.combobox = ttk.Combobox(tk_root, width=50, textvariable=self.textvariable, values=self.value_combobox, state='readonly')
self.combobox.current(None)
self.combobox.unbind_class("TCombobox", "<MouseWheel>")
self.combobox.bind('<<ComboboxSelected>>', lambda event: self.changed(event))
self.combobox.grid(column=1, row=row, sticky=tk.W)
def changed(self, event):
print(self.combobox.get())
if __name__ == '__main__':
a = ["?n u?ng", "?n u?ng > ?m th?c", "?n u?ng > ?m th?c > ?m th?c Hàn Qu?c", "?n u?ng > ?m th?c > ?m th?c Vi?t",
"?n u?ng > Cafe/N??c gi?i khát", "?n u?ng > Cafe/N??c gi?i khát > N??c hoa qu?", " sinh t?",
"?n u?ng > Cafe/N??c gi?i khát > Trà s?a", "?n u?ng > ?? u?ng", "?n u?ng > ?? u?ng có c?n",
"?n u?ng > ?? u?ng có c?n > Bia", "?n u?ng > ?? u?ng có c?n > R??u", "?n u?ng > Món ?n > ?n v?t",
"?n u?ng > Món ?n > Bánh > Bánh ?u", "?n u?ng > Món ?n > ??c s?n", "?n u?ng > Món ?n > Pizza",
"?n u?ng > Nhà hàng", "?n u?ng > Nhà hàng > Quán nh?u", "C?ng vi?c", "C?ng vi?c > D?ch v? ch?m sóc cá nhan",
"C?ng vi?c > D?ch v? ch?m sóc cá nhan > Nhan viên th?m m? vi?n", " spa", "C?ng vi?c > Giáo d?c",
"C?ng vi?c > Giáo d?c > Giáo d?c ti?u h?c", "C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Tr?c ??a", "C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng > Ki?n trúc dan d?ng",
"C?ng vi?c > Khoa h?c > Khoa h?c k? thu?t > Xay d?ng > K? s? xay d?ng", "C?ng vi?c > Ngh? thu?t bi?u di?n"]
b = ["?n u?ng", "?n u?ng > ?m th?c", "?n u?ng > ?m th?c > ?m th?c Hàn Qu?c", "?n u?ng > ?m th?c > ?m th?c Vi?t",
"?n u?ng > Cafe/N??c gi?i khát", "?n u?ng > Cafe/N??c gi?i khát > N??c hoa qu?, sinh t?"]
root = tk.Tk()
#root.geometry("600x700")
canvas = tk.Canvas(root, height=700, width=600)
ybar = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)
ybar.pack(side=tk.RIGHT, fill=tk.Y)
canvas.config(yscrollcommand=ybar.set)
# create a frame inside canvas for those labels and comboboxes
frame = tk.Frame(canvas)
canvas.create_window(0, 0, window=frame, anchor='nw')
# update scrollregion of canvas when the frame is resized
frame.bind('<Configure>', lambda e:canvas.config(scrollregion=canvas.bbox('all')))
count = 1
for i in a:
# changed root to frame
LabelAndCombobox(frame, count, i, b)
count = 1
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
root.bind('<MouseWheel>', lambda e: canvas.yview_scroll(e.delta//-120, 'units'))
root.mainloop()
請注意,我已更改from tkinter import *為,import tkinter as tk因為不建議使用通配符匯入。
uj5u.com熱心網友回復:
我發現這個解決方案最有用。
我根據這個答案以及其他答案創建了一個滾動框架類,您可以在此處找到。
此類可以使用包或網格添加到您的視窗/框架中。它還允許使用包或框架添加小部件。
uj5u.com熱心網友回復:
非常感謝@acw1668。他的解決方案對我有用。此外我想用滑鼠滾輪。下面是我的解決方案。希望對有同樣問題的朋友有所幫助
def on_mousewheel(event):
canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
canvas.bind_all("<MouseWheel>", on_mousewheel)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416045.html
標籤:
