问题描述
我正在尝试在窗口(tkinter)中插入滚动条,但是它不起作用。
下面是我用来插入滚动条的代码。
我正在使用tk.canvas和ttk.Scrollbar。
当我在注释中添加这一行(self.second_frame_outlier.pack(fill ='both')#,padx = 20,pady = 10))时,滚动条似乎可以工作,但是按钮没有出现。
任何想法我该如何解决?
import tkinter as tk
from tkinter import ttk
import pandas as pd
import numpy as np
from tkinter import filedialog as fd
from tkinter.ttk import Progressbar
from tkinter import HORIZONTAL
from tkinter import BOTH,Menu,END
from tkcalendar import DateEntry
from tkinter import messagebox
from os import path
from tkinter import IntVar
import sys
import os
class Mainframe(tk.Tk):
def __init__(self,*args,**kwargs):
tk.Tk.__init__(self,**kwargs)
container = tk.Frame(self)
container.pack(side="top",fill="both",expand=True)
container.grid_rowconfigure(0,weight=1)
container.grid_columnconfigure(0,weight=1)
self.frames = {}
for F in (HomeFrame,Project_Targets):
page_name = F.__name__
frame = F(parent=container,controller=self)
self.frames[page_name] = frame
# put all of the pages in the same location;
# the one on the top of the stacking order
# will be the one that is visible.
frame.grid(row=0,column=0,sticky="nsew")
self.show_frame("HomeFrame")
def show_frame(self,page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
#%%
class HomeFrame(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.controller = controller
label = tk.Label(self,text="App",fg="Black",font=("Franklin Gothic Medium",25)).pack(pady=20)
label = tk.Label(self,text="Hello " + os.getlogin() + ",how are you today?",fg="Grey",15)).pack(pady=20)
menubar = Menu(self.controller)
self.controller.config(menu=menubar)
targets = Menu(menubar,tearoff=0)
targets.add_command(label="New",command=lambda:controller.show_frame("Project_Targets"))
menubar.add_cascade(label="Country City",menu=targets)
class Project_Targets(tk.Frame):
def __init__(self,parent)
self.controller = controller
global lista_combobox,df_matriz_target,category
lista_combobox = []
category = {'Portugal':'Lisbon','Spain':'Madrid','France':'Paris','England':'London'}
label = tk.Label(self,text="App - Country City",25)).pack(pady=20)
self.wrapper = tk.LabelFrame(self)
self.wrapper.pack(fill='both',padx =20,pady=10)
#criar scrollbar geral
self.my_canvas_targets = tk.Canvas(self.wrapper)
self.my_scrollbar_targets = ttk.Scrollbar(self.wrapper,orient='vertical',command=self.my_canvas_targets.yview)
self.my_scrollbar_targets.pack(side=tk.RIGHT,fill='y')
self.my_canvas_targets.pack(side=tk.LEFT,fill='both',expand=1)
self.my_canvas_targets.configure(yscrollcommand=self.my_scrollbar_targets.set)
self.my_canvas_targets.bind('<Configure>',lambda e: self.my_canvas_targets.configure(scrollregion = self.my_canvas_targets.bbox("all")))
self.second_frame_outlier = tk.Frame(self.my_canvas_targets)
self.my_canvas_targets.create_window((0,0),window=self.second_frame_outlier,anchor="nw")
self.second_frame_outlier.pack(fill='both',pady=10)
#frame dos project and campaign
self.frame_main = tk.LabelFrame(self.second_frame_outlier,text = 'Country - City')
self.frame_main.pack(fill='both',pady=10)
self.label = tk.Label(self.frame_main,text="Step 1 - Select your Country ")
self.label.pack(pady=10)
self.box_3 = ttk.Combobox(self.frame_main,width = 20,values = list(category.keys()))
self.box_3.bind('<<ComboboxSelected>>',self.getUpdateData)
self.box_3.pack(pady=5)
self.label = tk.Label(self.frame_main,text="Step 2 - Select your City (Optional)")
self.label.pack(pady=10)
self.box_2 = ttk.Combobox(self.frame_main,width = 35)
self.box_2.pack()
self.btt_continue = ttk.Button(self.frame_main,text='Continue',command=self.save_values)
self.btt_continue.pack(pady=5)
d = {'Country': ['Portugal','Spain','France','England'],'City': ['Lisbon','Madrid','Paris','London'],'Age':[24,34,32,41],'School':[1,2,3,4],'Sex':[1,1,1],'SNS':[122,233,232,202]}
df_matriz_target = pd.DataFrame(data=d)
#criar frame treeview
self.frame = tk.LabelFrame(self.second_frame_outlier,text = 'Table Targets')
self.frame.pack(fill='both',pady=10)
#lista das columns names
table_columns=list(df_matriz_target.columns)
#criar tabela
# https://stackoverflow.com/questions/60875343/how-to-implement-tkinter-scrollbars
self.tree = ttk.Treeview(self.frame,columns=table_columns,show="headings",height = 10)#,height=9)#len(table_date))
self.hsb = tk.Scrollbar(self.frame,orient="horizontal",command=self.tree.xview)
self.vsb = tk.Scrollbar(self.frame,orient="vertical",command=self.tree.yview)
self.tree.configure(xscrollcommand=self.hsb.set,yscrollcommand=self.vsb.set)
# self.tree.pack()
self.tree.grid(column=0,row=0,sticky=tk.NSEW)
self.vsb.grid(column=1,sticky=tk.NS)
self.hsb.grid(column=0,row=1,sticky=tk.EW)
self.frame.grid_columnconfigure(0,weight=1)
self.frame.grid_rowconfigure(0,weight=1)
#criar haedings
for col in table_columns:
self.tree.heading(col,text=col.title())
#criar frame add update
self.second_frame = tk.LabelFrame(self.second_frame_outlier,text = 'Add or Update')
self.second_frame.pack(fill='both',pady=10)
self.label_dir = tk.Label(self.second_frame,text="Step 1 - Choose the folder 1:")
self.label_dir.pack(pady=10)
self.label_dir2 = tk.Label(self.second_frame,text="Step 1 - Choose the 2:")
self.label_dir2.pack(pady=10)
self.label_dir3 = tk.Label(self.second_frame,text="Step 1 - Choose the 3:")
self.label_dir3.pack(pady=10)
self.label_dir4 = tk.Label(self.second_frame,text="Step 1 - Choose the 4:")
self.label_dir4.pack(pady=10)
self.label_dir5 = tk.Label(self.second_frame,text="Step 1 - 5:")
self.label_dir5.pack(pady=10)
def getUpdateData(self,event):
'''
Funcao de atualizacao das comboboxes Country and City
'''
if lista_combobox ==[]:
lista_combobox.append(1)
self.box_2['values'] = category[self.box_3.get()]
else:
#apagar a campaign caso se mude de projecto
self.box_2.set('')
self.box_2['values'] = category[self.box_3.get()]
def save_values(self):
'''
Save names of Country and City
'''
global ProjectCode,CampaignName,df_matriz_target_aux
Country = self.box_3.get()
City = self.box_2.get()
print('Country',Country)
print('City',City)
df_matriz_target_aux = df_matriz_target[df_matriz_target['Country'] == Country]
if City != '':
df_matriz_target_aux = df_matriz_target_aux[df_matriz_target_aux['City'] == City]
#inserir data
self.tree.delete(*self.tree.get_children())
for index,row in df_matriz_target_aux.iterrows():
self.tree.insert("",text=index,values=list(row))
#%%
# show window
if __name__=="__main__":
app=Mainframe()
app.title("APP")
app.geometry("800x700")
app.mainloop()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)