首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在tkinter中滚动所需的treeview列

如何在tkinter中滚动所需的treeview列
EN

Stack Overflow用户
提问于 2017-01-25 05:51:56
回答 2查看 1.6K关注 0票数 0

我正在开发一个GUI应用程序,其中一些数据将从数据库中提取,并将显示在树视图中。但问题是,我的treeview大约有20列,这已经太多了。我的意思是整个应用程序不能适应我的屏幕。

因此,我希望最初只显示2-3列,我希望其余的列通过滚动条可见。

我使用了“displaycolumn”选项来显示前3列,我也创建了滚动条,但我不知道如何通过滚动条显示其余的列。

以下是我的代码,我删除了按钮方法和数据库功能,以简化它

将tkinter作为tk从tkinter导入ttk从tkinter导入文件导入tkFont对话框将tkinter.font作为openpyxl导入

代码语言:javascript
运行
复制
   class MainWindow(tk.Tk):
    def __init__(self,*args,**kwargs):
     tk.Tk.__init__(self,*args,**kwargs)

    #Creating Geometry Of the window
    #self.geometry("500x500+0+0")
    self.title("Test Software")

    #Creating Labels

    self.agreement_number_label = tk.Label(text="Agreement Number")
    self.area_office_label = tk.Label(text="Area office")
    self.branch_label = tk.Label(text="Branch")
    self.customer_name_label = tk.Label(text="Customer Name")
    self.model_label = tk.Label(text="Model")
    self.registered_number_label = tk.Label(text="Registered Number")
    self.engine_number_label = tk.Label(text="Engine Number")
    self.chasis_number_label = tk.Label(text="Chasis Number")
    self.make_label = tk.Label(text="Make")

    #creating entry fields variables

    self.agreement_number = tk.StringVar()
    self.area_office = tk.StringVar()
    self.branch = tk.StringVar()
    self.customer_name = tk.StringVar()
    self.model = tk.StringVar()
    self.registered_number = tk.StringVar()
    self.engine_number = tk.StringVar()
    self.chasis_number = tk.StringVar()
    self.make = tk.StringVar()

    #creating Entry Fields

    self.agreement_number_entry = tk.Entry(textvariable = self.agreement_number)
    self.area_office_entry = tk.Entry(textvariable = self.area_office)
    self.branch_entry = tk.Entry(textvariable = self.branch)
    self.customer_name_entry = tk.Entry(textvariable = self.customer_name)
    self.model_entry = tk.Entry(textvariable = self.model)
    self.registered_number_entry = tk.Entry(textvariable = self.registered_number)
    self.engine_number_entry = tk.Entry(textvariable = self.engine_number)
    self.chasis_number_entry = tk.Entry(textvariable = self.chasis_number)
    self.make_entry = tk.Entry(textvariable = self.make)

    #Adding Labels and Entry Fields to the grid
    #1st Row Fields
    self.agreement_number_label.grid(row=0,column=0,pady=(25,0),sticky="w",padx=(20,0))
    self.agreement_number_entry.grid(row=0,column=1,pady=(25,0),sticky="w")
    self.area_office_label.grid(row=0,column=2,pady=(25,0),sticky="w")
    self.area_office_entry.grid(row=0,column=3,pady=(25,0),sticky="w")
    self.branch_label.grid(row=0,column=4,pady=(25,0),sticky="w")
    self.branch_entry.grid(row=0,column=5,pady=(25,0),sticky="w",padx=(0,20))
    #2nd row fields
    self.customer_name_label.grid(row=1,column=0,sticky="w",padx=(20,0))
    self.customer_name_entry.grid(row=1,column=1,sticky="w")
    self.model_label.grid(row=1,column=2,sticky="w")
    self.model_entry.grid(row=1,column=3,sticky="w")
    self.registered_number_label.grid(row=1,column=4,sticky="w")
    self.registered_number_entry.grid(row=1,column=5,sticky="w",padx=(0,20))
    #3rd Row Fields
    self.chasis_number_label.grid(row=2,column=0,sticky="w",padx=(20,0))
    self.chasis_number_entry.grid(row=2,column=1,sticky="w")
    self.engine_number_label.grid(row=2,column=2,sticky="w")
    self.engine_number_entry.grid(row=2,column=3,sticky="w")
    self.make_label.grid(row=2,column=4,sticky="w")
    self.make_entry.grid(row=2,column=5,sticky="w",padx=(0,20))

    #Creating a search button
    self.search_button = tk.Button(text = "Search Record",width=25)

    #Adding the Search Button into the grid
    self.search_button.grid(row=3,column=0,columnspan=6,pady=10)

    #Adding a Seperator to the grid
    ttk.Separator(orient="horizontal").grid(row=4,columnspan=6,sticky="ew")


    #Creating A Treeview
    self.treeview = ttk.Treeview(height=6)
    self.treeview['columns'] = ("One","Two","Three")
    self.treeview.column('#0',width=100)
    self.treeview.heading("#0", text="Testing")
    self.treeview.heading("One", text="Column A")
    self.treeview.heading("Two", text="Column B")
    self.treeview.heading("Three", text="Column C")
    self.treeview.grid(row=5,rowspan=5,column=0,columnspan=4,pady=(10,0))

    #Adding Default Data to The Treeview
    for i in range(10):
        self.treeview.insert("" , "end",    text="Line "+str(i), values=("1A","1b"))

    #Creating a treeview scrollbar
    self.vertical_scrollbar = tk.Scrollbar(orient='vertical')
    self.horizontal_scrollbar = tk.Scrollbar(orient='horizontal')

    #adding scrollbars to the grid
    self.vertical_scrollbar.grid(row=5,column=4,rowspan=6)
    self.horizontal_scrollbar.grid(row=10,column=0,columnspan=4)

    #configuring scrolls to treeview
    self.horizontal_scrollbar.configure(command=self.treeview.xview)
    self.vertical_scrollbar.configure(command=self.treeview.yview)

    #configuring treeview to Scrollbar
    self.treeview.configure(yscrollcommand=self.vertical_scrollbar.set)
    self.treeview.configure(xscrollcommand=self.horizontal_scrollbar.set)

    #Creating buttons
    self.view_all_record_btn = tk.Button(text="View All Records",width=15)
    self.add_record_btn = tk.Button(text="Add Record",width=15)
    self.edit_record_btn = tk.Button(text="Edit Record",width=15)
    self.delete_record_btn = tk.Button(text="Delete Record",width=15)
    self.upload_file_btn = tk.Button(text="Upload File",width=15)

    #Adding Buttons to the Grid
    self.view_all_record_btn.grid(row=5,column=5,pady=(10,0))
    self.add_record_btn.grid(row=6,column=5)
    self.edit_record_btn.grid(row=7,column=5)
    self.delete_record_btn.grid(row=8,column=5)
    self.upload_file_btn.grid(row=9,column=5,pady=(0,20))

    root = MainWindow()
    root.mainloop()

我的问题是,我必须在这里添加大约20列,但我只想一次显示3-4列,其余的列将只能通过滚动条可见,我的行滚动条工作正常,但我不知道如何为列做这件事

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-01-25 07:39:21

欢迎。我相信你的问题取决于你的布局管理器设置。对于网格系统,我通过调整相关框架的.rowconfigure.columnconfigure设置实现了您想要的结果。如果你做对了,你应该能够在最初显示2-3列,然后当需要在一个树形视图中查看其他17-18列时,使用xscrollbar查看其他“隐藏”列。

顺便说一句,当您在问题中包含mvce代码时,社区可以提供更好的帮助。这是您的代码的最小化版本,足以重现您的问题,并让其他人帮助您。

票数 0
EN

Stack Overflow用户

发布于 2017-10-18 19:51:38

基于@Sun Bear的回答和这个website,我实现了TreeView版本的组合水平滚动条。这确实是.rowconfigure. columnconfigure的问题。你可以运行下面的示例代码,你就会知道它是如何工作的。你也可以在下图中看到执行结果。

result image link

代码语言:javascript
运行
复制
try:
    from tkinter import *
    from tkinter import ttk
except ImportError:
    from Tkinter import *
    from Tkinter import ttk

root = Tk()

content = ttk.Frame(root, padding=(3,3,12,12))

# initialize a TreeView
myTreeView = ttk.Treeview(content)
myTreeView["columns"] = ("Index", "Value", "Price", "LAST_PRICE")
myTreeView.column("Index", stretch=False, width=150)
myTreeView.column("Value", stretch=False, width=100)
myTreeView.column("Price", stretch=False, width=100)
myTreeView.column("LAST_PRICE", stretch=False, width=100)
myTreeView.heading("Index", text="Index")
myTreeView.heading("Value", text="Value")
myTreeView.heading("Price", text="Price")
myTreeView.heading("LAST_PRICE", text="Last Price")

# attach a Horizontal (x) scrollbar to the frame
treeXScroll = ttk.Scrollbar(content, orient=HORIZONTAL)
treeXScroll.configure(command=myTreeView.xview)
myTreeView.configure(xscrollcommand=treeXScroll.set)

# initialize the Label and Entry
namelbl = ttk.Label(content, text="Name")
name = ttk.Entry(content)

# initialize Checkbuttons
onevar = BooleanVar()
twovar = BooleanVar()
threevar = BooleanVar()
onevar.set(True)
twovar.set(False)
threevar.set(True)
one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
three = ttk.Checkbutton(content, text="Three", variable=threevar, onvalue=True)

# initialize Buttons
ok = ttk.Button(content, text="Okay")
cancel = ttk.Button(content, text="Cancel")

# set position of all above objects by grid
content.grid(column=0, row=0, sticky=(N, S, E, W))
myTreeView.grid(column=0, row=0, columnspan=3, rowspan=2, sticky=(N, S, E, W))
treeXScroll.grid(column=0, row=3, columnspan=3, sticky=W + E)
namelbl.grid(column=3, row=0, columnspan=2, sticky=(N, W), padx=5)
name.grid(column=3, row=1, columnspan=2, sticky=(N, E, W), pady=5, padx=5)
one.grid(column=0, row=4)
two.grid(column=1, row=4)
three.grid(column=2, row=4)
ok.grid(column=3, row=4)
cancel.grid(column=4, row=4)

# Handling Resize
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=3)
content.columnconfigure(1, weight=3)
content.columnconfigure(2, weight=3)
content.columnconfigure(3, weight=1)
content.columnconfigure(4, weight=1)
content.rowconfigure(1, weight=1)

# run UI
root.mainloop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41839628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档