如何在python 3.4中使用tkinter添加2个滚动条? [英] How to add 2 scrollbars with tkinter in python 3.4?
问题描述
我有以下代码:
from win32com.client import Dispatch从 tkinter 导入 *从 tkinter 导入 ttk导入 tkinter课堂应用:def __init__(self, root):self.root = 根self.root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')ttk.Frame(self.root, width=300, height=250).pack()####标签列表self.titoli = 列表()self.titoli_BFT = ["Num_Doc", "Cod_Art", "Unita Misura", "Tot_Prod", "Quant_Prod", "Perc_IVA_Prod", "Tot_IVA_Prod",Linea_Prod"、Sconto"、Perc_Sconto"、Tipo_Sconto"、Cod_Art2"、Desc_Art"]self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2","Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",Cod_Dest"、Cli_RagSoc1"、Cli_RagSoc2"、Cli_Indirizzo"、Cli_CAP"、"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc","Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",Descr"、Num_Ord"、Tot_Imp"、Tot_IVA"、Tot_Doc"、Nazione"、IPA"、Reg_Fiscale"]self.titoli_IVA = ["Num_Doc_TMP", "Num_Doc", "Imponibile", "IVA, Tot", "Perc_IVA"]self.titoli_RIF_DOC = [ "Num_Doc_TMP", "Num_Doc", "Rif_Doc" ]self.titoli_RIF_DOC_BFT = ["Num_Doc_TMP", "Num_Doc", "Cod_Art", "NOTE" ]self.titoli_anomalieBFT = ["ordine", "异常"]self.titoli_anomalieHFT = ["ordine", "anomalia"]self.inizializza_widgets()self.lettura()def inizializza_widgets(self):#标签self.lblins=tkinter.Label(self.root, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))self.lblins.place(x=10, y=10对于范围内的 i (0,len(self.titoli_HFT)):j = 80*iself.lblnome=tkinter.Label(self.root, text= self.titoli_HFT[i], font=("Helvetica", 8))self.lblnome.place(x=85+j, y=50)#纽扣ttk.Button(self.root, , text='Inserisci', width='10').place(x=645, y=590)#pulsante letturattk.Button(self.root, text='Modifica', width='10').place(x=725, y=590)ttk.Button(self.root, text='Indietro', width='10').place(x=805, y=590)ttk.Button(self.root, text='Avanti', width='10').place(x=885, y=590)def onFrameConfigure(self, event):'''重置滚动区域以包含内部框架'''self.canvas.configure(scrollregion=self.canvas.bbox("all"))def lettura(自我):xl=调度(Excel.Application")xl.Visible = 真self.checkb_intvar = list() #contiene una lista di 1 o 0 associati alle checkbox nella lista quadratiniself.quadratiniB = l = [无] * (13 * len(self.titoli_BFT) )self.quadratiniH = l = [无] * (13 * len(self.titoli_HFT) )wbH = xl.Workbooks.Open(r'C:\Users\\Marco\\LAVORO\\Smith&Nephew\\appRonca\\fonte\\HFT_SAP_2.csv')打印(wbH")wsH=wbH.WorkSheets(1) # 获取对第一张工作表的引用续 = 0MAX = 3 #13 lunghezza visibile senza barra navigatrice del numero di righe nella bestra 13续 = 0对于范围内的 i (0, MAX):对于范围内的 j(0,len(self.titoli_HFT)):打印(为")连续 = 连续 + 1打印(我")打印(一)打印(j")打印(j)print(" {} 集通常表示为 {{0}} ".format("empty"))#### DI excel 单元格管理的索引k = 80*j #i con jl = 40*i #k con lcontvalueX = i + 1 #con 0 da errore allora +1contvalueY = j + 1 #con 0 da errore allora +1self.txt1 = tkinter.Text(self.root, width='10', height='1')#读取excel单元格文件if (wsH.Cells(contvalueX, contvalueY ).Value != None):self.txt1.insert('1.0', wsH.Cells(contvalueX, contvalueY ).Value)#ws.Cells(1,i).Valueself.txt1.tag_add("开始", "1.0", "1.13")如果(contvalueY == 1):self.txt1.tag_config("start", background="white", foreground="red")#self.txt1.tag_configure("red", foreground="red")#self.txt1.highlight_pattern("word", "red")#self.txt1 = tkinter.Text(self.root, width='10', height='1', text = ws.Cells(1,i).Value)self.txt1.place(x=85+k, y=80+l) #5 + 80打印(如果")else: #None case打印(其他")self.txt1.insert('1.0', "")self.txt1.place(x=85+k, y=80+l)如果(contvalueY == 1):self.txt1.tag_config("start", background="white", foreground="red")wbH.Close()xl.退出()如果 __name__ == '__main__':根 = tkinter.Tk()w, h = root.winfo_screenwidth(), root.winfo_screenheight()root.geometry("%dx%d+0+0" % (w, h))应用程序(根)root.mainloop()
应用程序运行:
我从一个 excel 文件中读取数据(lettura 函数)但我想添加一个水平和垂直滚动条,我首先阅读:
它并不完美,因为它缺少右下角的小块.
更新 1 : 添加了 Sizegrip 以获得右下角调整大小
更新 2:为 OP 的更新代码添加了工作解决方案
from win32com.client import Dispatch从 tkinter 导入 *从 tkinter 导入 ttk导入 tkinter类应用程序(对象):def __init__(self, root):self.root = 根# 顶级框架self.root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')self.frame = ttk.Frame(self.root, width=300, height=250)# 使用双滚动条创建画布hscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.HORIZONTAL)vscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.VERTICAL)sizegrip = ttk.Sizegrip(self.frame)self.canvas = tkinter.Canvas(self.frame, bd=0, highlightthickness=0, yscrollcommand = vscrollbar.set, xscrollcommand = hscrollbar.set)vscrollbar.config(command = self.canvas.yview)hscrollbar.config(command = self.canvas.xview)# 在此处添加控件self.subframe = ttk.Frame(self.canvas)#### 标题self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2","Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",Cod_Dest"、Cli_RagSoc1"、Cli_RagSoc2"、Cli_Indirizzo"、Cli_CAP"、"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc","Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",Descr"、Num_Ord"、Tot_Imp"、Tot_IVA"、Tot_Doc"、Nazione"、IPA"、Reg_Fiscale"]self.inizializza_widgets()#打包一切self.subframe.pack(fill = tkinter.BOTH, expand = tkinter.TRUE)hscrollbar.pack(fill=tkinter.X, side=tkinter.BOTTOM, expand=tkinter.FALSE)vscrollbar.pack(fill=tkinter.Y, side=tkinter.RIGHT, expand=tkinter.FALSE)sizegrip.pack(in_= hscrollbar, side = BOTTOM, anchor = "se")self.canvas.pack(side = tkinter.LEFT, padx = 5, pady = 5, fill = tkinter.BOTH, expand= tkinter.TRUE)self.frame.pack( padx = 5, pady = 5, expand = True, fill = tkinter.BOTH)self.canvas.create_window(0,0, window = self.subframe)self.root.update_idletasks() # 更新几何self.canvas.config(scrollregion = self.canvas.bbox("all"))self.canvas.xview_moveto(0)self.canvas.yview_moveto(0)def inizializza_widgets(self):self.LabelFrame = ttk.Frame(self.subframe)self.lblins = tkinter.Label(self.LabelFrame, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))self.lblins.pack()对于范围内的 i (0,len(self.titoli_HFT)):j = 80*iself.lblnome=tkinter.Label(self.LabelFrame, text= self.titoli_HFT[i], font=("Helvetica", 8))self.lblnome.pack(side = LEFT)#place(x=85+j, y=50)self.ContentFrame = ttk.Frame(self.subframe, width = 600, height = 600)self.ButtonsFrame = ttk.Frame(self.subframe)ttk.Frame(self.ButtonsFrame).pack(side=LEFT, fill = X, expand=TRUE)ttk.Button(self.ButtonsFrame, text='Inserisci', width='10').pack(side = LEFT)ttk.Button(self.ButtonsFrame, text='Modifica', width='10').pack(side = LEFT)ttk.Button(self.ButtonsFrame, text='Indietro', width='10').pack(side = LEFT)ttk.Button(self.ButtonsFrame, text='Avanti', width='10').pack(side = LEFT)ttk.Frame(self.ButtonsFrame).pack(side=RIGHT, fill = X, expand=TRUE)self.LabelFrame.pack(side = TOP, fill = X, expand=TRUE)self.ContentFrame.pack(fill = BOTH, expand = TRUE)self.ButtonsFrame.pack(side = BOTTOM, fill = X, expand = TRUE)如果 __name__ == '__main__':根 = tkinter.Tk()root.title("带有 tkinter 的双滚动条")w, h = root.winfo_screenwidth(), root.winfo_screenheight()root.geometry("%dx%d+0+0" % (0.99*w, 0.9*h))应用程序(根)root.mainloop()
I have the following code:
from win32com.client import Dispatch
from tkinter import *
from tkinter import ttk
import tkinter
class applicazione:
def __init__(self, root):
self.root = root
self.root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')
ttk.Frame(self.root, width=300, height=250).pack()
#### label list
self.titoli = list()
self.titoli_BFT = ["Num_Doc", "Cod_Art", "Unita Misura", "Tot_Prod", "Quant_Prod", "Perc_IVA_Prod", "Tot_IVA_Prod",
"Linea_Prod", "Sconto", "Perc_Sconto", "Tipo_Sconto", "Cod_Art2", "Desc_Art"]
self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2",
"Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",
"Cod_Dest", "Cli_RagSoc1", "Cli_RagSoc2", "Cli_Indirizzo", "Cli_CAP",
"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc",
"Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",
"Descr", "Num_Ord", "Tot_Imp", "Tot_IVA", "Tot_Doc", "Nazione", "IPA", "Reg_Fiscale"]
self.titoli_IVA = ["Num_Doc_TMP", "Num_Doc", "Imponibile", "IVA, Tot", "Perc_IVA"]
self.titoli_RIF_DOC = [ "Num_Doc_TMP", "Num_Doc", "Rif_Doc" ]
self.titoli_RIF_DOC_BFT = ["Num_Doc_TMP", "Num_Doc", "Cod_Art", "NOTE" ]
self.titoli_anomalieBFT = ["ordine", "anomalia"]
self.titoli_anomalieHFT = ["ordine", "anomalia"]
self.inizializza_widgets()
self.lettura()
def inizializza_widgets(self):
#label
self.lblins=tkinter.Label(self.root, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))
self.lblins.place(x=10, y=10
for i in range (0,len(self.titoli_HFT)):
j = 80*i
self.lblnome=tkinter.Label(self.root, text= self.titoli_HFT[i], font=("Helvetica", 8))
self.lblnome.place(x=85+j, y=50)
#buttons
ttk.Button(self.root, , text='Inserisci', width='10').place(x=645, y=590)
#pulsante lettura
ttk.Button(self.root, text='Modifica', width='10').place(x=725, y=590)
ttk.Button(self.root, text='Indietro', width='10').place(x=805, y=590)
ttk.Button(self.root, text='Avanti', width='10').place(x=885, y=590)
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def lettura(self):
xl= Dispatch("Excel.Application")
xl.Visible = True
self.checkb_intvar = list() #contiene una lista di 1 o 0 associati alle checkbox nella lista quadratini
self.quadratiniB = l = [None] * (13 * len(self.titoli_BFT) )
self.quadratiniH = l = [None] * (13 * len(self.titoli_HFT) )
wbH = xl.Workbooks.Open(r'C:\Users\\Marco\\LAVORO\\Smith&Nephew\\appRonca\\fonte\\HFT_SAP_2.csv')
print("wbH")
wsH=wbH.WorkSheets(1) # get a reference to the first sheet
cont = 0
MAX = 3 #13 lunghezza visibile senza barra navigatrice del numero di righe nella finestra 13
cont = 0
for i in range(0, MAX):
for j in range(0,len(self.titoli_HFT)):
print("for for")
cont = cont + 1
print("i")
print(i)
print("j")
print(j)
print(" The {} set is often represented as {{0}} ".format("empty"))
#### indexes for DI excel cells management
k = 80*j #i con j
l = 40*i #k con l
contvalueX = i + 1 #con zero da errore allora +1
contvalueY = j + 1 #con zero da errore allora +1
self.txt1 = tkinter.Text(self.root, width='10', height='1')
#Reading excel cells file
if (wsH.Cells(contvalueX, contvalueY ).Value != None):
self.txt1.insert('1.0', wsH.Cells(contvalueX, contvalueY ).Value)#ws.Cells(1,i).Value
self.txt1.tag_add("start", "1.0", "1.13")
if (contvalueY == 1 ):
self.txt1.tag_config("start", background="white", foreground="red")
#self.txt1.tag_configure("red", foreground="red")
#self.txt1.highlight_pattern("word", "red")
#self.txt1 = tkinter.Text(self.root, width='10', height='1', text = ws.Cells(1,i).Value)
self.txt1.place(x=85+k, y=80+l) #5 + 80
print("if")
else: #None case
print("else")
self.txt1.insert('1.0', "")
self.txt1.place(x=85+k, y=80+l)
if (contvalueY == 1 ):
self.txt1.tag_config("start", background="white", foreground="red")
wbH.Close()
xl.Quit()
if __name__ == '__main__':
root = tkinter.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))
applicazione(root)
root.mainloop()
The application runned:
I read data from an excel file (lettura function) but i would like to add an horizontal and a vertical scrollbar i read first of all this:
Adding a scrollbar to a group of widgets in Tkinter
but use "grid" that i do not use and i'm not able to associate my double "for" "Text" to the vertical scroll bar (Lettura function)
The following code is edited with the scrollbar but does not work:
import tkinter as tk
from win32com.client import Dispatch
from tkinter import *
#from tkinter import ttk
import tkinter
class Example(tk.Frame):
def __init__(self, root):
tk.Frame.__init__(self, root)
root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')
#tk.Frame(root, width=100, height=450).pack()
self.canvas = tk.Canvas(root, borderwidth=0, background="#C0C0C0")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw",
tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
self.titoli_BFT = ["Num_Doc", "Cod_Art", "Unita Misura", "Tot_Prod", "Quant_Prod", "Perc_IVA_Prod", "Tot_IVA_Prod",
"Linea_Prod", "Sconto", "Perc_Sconto", "Tipo_Sconto", "Cod_Art2", "Desc_Art"]
self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2",
"Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",
"Cod_Dest", "Cli_RagSoc1", "Cli_RagSoc2", "Cli_Indirizzo", "Cli_CAP",
"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc",
"Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",
"Descr", "Num_Ord", "Tot_Imp", "Tot_IVA", "Tot_Doc", "Nazione", "IPA", "Reg_Fiscale"]
#self.inizializza_widgets()
self.populate()
self.lettura()
def inizializza_widgets(self):
#label title
self.lblins=tk.Label(root, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))
self.lblins.place(x=10, y=10)
for i in range (0,len(self.titoli_HFT)):
j = 80*i
self.lblnome=tk.Label(root, text= self.titoli_HFT[i], font=("Helvetica", 8))
self.lblnome.place(x=85+j, y=50)
#965 560
tk.Button(root, text='Inserisci', width='10').place(x=645, y=590)
#pulsante lettura
tk.Button(root, text='Modifica', width='10').place(x=725, y=590)
tk.Button(root, text='Indietro', width='10').place(x=805, y=590)
tk.Button(root, text='Avanti', width='10').place(x=885, y=590)
def lettura(self):
xl= Dispatch("Excel.Application")
xl.Visible = True
wbH = xl.Workbooks.Open(r'C:\Users\\Marco\\LAVORO\\Smith&Nephew\\appRonca\\fonte\\HFT_SAP_2.csv')
print("wbH")
wsH=wbH.WorkSheets(1) # get a reference to the first sheet
cont = 0
MAX = 9 #13 lunghezza visibile senza barra navigatrice del numero di righe nella finestra 13
cont = 0
for i in range(0, MAX):
for j in range(0,len(self.titoli_HFT)):
print("for for")
cont = cont + 1
print("cont")
print(cont)
#### INDEXES
k = 80*j #i con j
l = 40*i #k con l
contvalueX = i + 1 #con zero da errore allora +1
contvalueY = j + 1 #con zero da errore allora +1
self.txt1 = tk.Text(root, width='10', height='1')
#Lettura celle del file HFT
if (wsH.Cells(contvalueX, contvalueY ).Value != None):
self.txt1.insert('1.0', wsH.Cells(contvalueX, contvalueY ).Value)#ws.Cells(1,i).Value
self.txt1.tag_add("start", "1.0", "1.13")
if (contvalueY == 1 ):
self.txt1.tag_config("start", background="white", foreground="red")
self.txt1.place(x=85+k, y=80+l) #5 + 80
print("if")
else: #None case
print("else")
self.txt1.insert('1.0', "")
self.txt1.place(x=85+k, y=80+l)
if (contvalueY == 1 ): #### qui si richiama la funziona regole con tutte le regole
self.txt1.tag_config("start", background="white", foreground="red")
wbH.Close()
xl.Quit()
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if __name__ == "__main__":
root=tk.Tk()
Example(root).pack(side="top", fill="both", expand=True)
root.mainloop()
and this: How to add a scrollbar to a window with tkinter? that is not organise like a class.
how can i implement the 2 scrollbars?
UPDATE
new version:
from win32com.client import Dispatch
from tkinter import *
from tkinter import ttk
import tkinter
class applicazione:
def __init__(self, root):
self.root = root
# Top-level frame
self.frame = ttk.Frame(self.root, relief="sunken")
# Canvas creation with double scrollbar
hscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.HORIZONTAL)
vscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.VERTICAL)
self.canvas = tkinter.Canvas(self.frame, bd=0, highlightthickness=0, yscrollcommand = vscrollbar.set, xscrollcommand = hscrollbar.set)
vscrollbar.config(command = self.canvas.yview)
hscrollbar.config(command = self.canvas.xview)
# Add controls here
self.subframe = ttk.Frame(self.canvas)
#Packing everything
self.subframe.pack(padx = 15, pady = 15, fill = tkinter.BOTH, expand = tkinter.TRUE)
hscrollbar.pack( fill=tkinter.X, side=tkinter.BOTTOM, expand=tkinter.FALSE)
vscrollbar.pack( fill=tkinter.Y, side=tkinter.RIGHT, expand=tkinter.FALSE)
self.canvas.pack(side = tkinter.LEFT, padx = 5, pady = 5, fill = tkinter.BOTH, expand= tkinter.TRUE)
self.frame.pack( padx = 5, pady = 5, expand = True, fill = tkinter.BOTH)
self.canvas.create_window(0,0, window = self.subframe)
self.root.update_idletasks() # update geometry
self.canvas.config(scrollregion = self.canvas.bbox("all"))
self.canvas.xview_moveto(0)
self.canvas.yview_moveto(0)
self.root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')
ttk.Frame(self.root, width=300, height=250).pack()
#### Titles
self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2",
"Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",
"Cod_Dest", "Cli_RagSoc1", "Cli_RagSoc2", "Cli_Indirizzo", "Cli_CAP",
"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc",
"Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",
"Descr", "Num_Ord", "Tot_Imp", "Tot_IVA", "Tot_Doc", "Nazione", "IPA", "Reg_Fiscale"]
self.inizializza_widgets()
def inizializza_widgets(self):
self.lblins=tkinter.Label(self.root, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))
self.lblins.place(x=10, y=10)
for i in range (0,len(self.titoli_HFT)):
j = 80*i
self.lblnome=tkinter.Label(self.root, text= self.titoli_HFT[i], font=("Helvetica", 8))
self.lblnome.place(x=85+j, y=50)
ttk.Button(self.root, text='Inserisci', width='10').place(x=645, y=590)
ttk.Button(self.root, text='Modifica', width='10').place(x=725, y=590)
ttk.Button(self.root, text='Indietro', width='10').place(x=805, y=590)
ttk.Button(self.root, text='Avanti', width='10').place(x=885, y=590)
if __name__ == '__main__':
root = tkinter.Tk()
root.title( "Double scrollbar with tkinter" )
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))
applicazione(root)
root.mainloop()
I've also struggled with creating a double scrollbar window. Here is an implementation using pack
layout manager (you should be able to tailor it for a grid
layout) :
import tkinter as tk
from tkinter import ttk
# Top-level frame
root = tk.Tk()
root.title( "Double scrollbar with tkinter" )
root.minsize(width = 600, height = 600)
frame = ttk.Frame(root, relief="sunken")
# Canvas creation with double scrollbar
hscrollbar = ttk.Scrollbar(frame, orient = tk.HORIZONTAL)
vscrollbar = ttk.Scrollbar(frame, orient = tk.VERTICAL)
sizegrip = ttk.Sizegrip(frame)
canvas = tk.Canvas(frame, bd=0, highlightthickness=0, yscrollcommand = vscrollbar.set, xscrollcommand = hscrollbar.set)
vscrollbar.config(command = canvas.yview)
hscrollbar.config(command = canvas.xview)
# Add controls here
subframe = ttk.Frame(canvas)
#Packing everything
subframe.pack(padx = 15, pady = 15, fill = tk.BOTH, expand = tk.TRUE)
hscrollbar.pack( fill=tk.X, side=tk.BOTTOM, expand=tk.FALSE)
vscrollbar.pack( fill=tk.Y, side=tk.RIGHT, expand=tk.FALSE)
sizegrip.pack(in_ = hscrollbar, side = tk.BOTTOM, anchor = "se")
canvas.pack(side = tk.LEFT, padx = 5, pady = 5, fill = tk.BOTH, expand= tk.TRUE)
frame.pack( padx = 5, pady = 5, expand = True, fill = tk.BOTH)
canvas.create_window(0,0, window = subframe)
root.update_idletasks() # update geometry
canvas.config(scrollregion = canvas.bbox("all"))
canvas.xview_moveto(0)
canvas.yview_moveto(0)
# launch the GUI
root.mainloop()
(Tested with Python 3.4).
Exemples :
It's not perfect, since it lacks the small block on the bottom right corner.
UPDATE 1 : Added Sizegrip to get the bottom right resizing corner
UPDATE 2 : Added working solution to OP's updated code
from win32com.client import Dispatch
from tkinter import *
from tkinter import ttk
import tkinter
class applicazione(object):
def __init__(self, root):
self.root = root
# Top-level frame
self.root.title('Controllo dati per fatturazione elettronica - Manticle - Smith & Nephew Italia')
self.frame = ttk.Frame(self.root, width=300, height=250)
# Canvas creation with double scrollbar
hscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.HORIZONTAL)
vscrollbar = ttk.Scrollbar(self.frame, orient = tkinter.VERTICAL)
sizegrip = ttk.Sizegrip(self.frame)
self.canvas = tkinter.Canvas(self.frame, bd=0, highlightthickness=0, yscrollcommand = vscrollbar.set, xscrollcommand = hscrollbar.set)
vscrollbar.config(command = self.canvas.yview)
hscrollbar.config(command = self.canvas.xview)
# Add controls here
self.subframe = ttk.Frame(self.canvas)
#### Titles
self.titoli_HFT = ["Dest_Cod_FIS_P_Iva", "Cod_Cli", "Dest_RagSoc1", "Dest_RagSoc2",
"Dest_Indirizzo", "Dest_CAP", "Dest_Localita", "Dest_Provincia", "Cli_Cod_Fis_P_Iva",
"Cod_Dest", "Cli_RagSoc1", "Cli_RagSoc2", "Cli_Indirizzo", "Cli_CAP",
"Cli_Localita", "Cli_Provincia", "Tipo_Doc", "pre_Num_Doc", "Num_Doc",
"Data_Doc", "Vs_Rif", "Data_Rif", "Blank", "Blank2", "CPT", "Scad_Pagamento",
"Descr", "Num_Ord", "Tot_Imp", "Tot_IVA", "Tot_Doc", "Nazione", "IPA", "Reg_Fiscale"]
self.inizializza_widgets()
#Packing everything
self.subframe.pack(fill = tkinter.BOTH, expand = tkinter.TRUE)
hscrollbar.pack( fill=tkinter.X, side=tkinter.BOTTOM, expand=tkinter.FALSE)
vscrollbar.pack( fill=tkinter.Y, side=tkinter.RIGHT, expand=tkinter.FALSE)
sizegrip.pack(in_= hscrollbar, side = BOTTOM, anchor = "se")
self.canvas.pack(side = tkinter.LEFT, padx = 5, pady = 5, fill = tkinter.BOTH, expand= tkinter.TRUE)
self.frame.pack( padx = 5, pady = 5, expand = True, fill = tkinter.BOTH)
self.canvas.create_window(0,0, window = self.subframe)
self.root.update_idletasks() # update geometry
self.canvas.config(scrollregion = self.canvas.bbox("all"))
self.canvas.xview_moveto(0)
self.canvas.yview_moveto(0)
def inizializza_widgets(self):
self.LabelFrame = ttk.Frame(self.subframe)
self.lblins = tkinter.Label(self.LabelFrame, text="Controllo dati per fatturazione elettronica", font=("Helvetica", 12))
self.lblins.pack()
for i in range (0,len(self.titoli_HFT)):
j = 80*i
self.lblnome=tkinter.Label(self.LabelFrame, text= self.titoli_HFT[i], font=("Helvetica", 8))
self.lblnome.pack(side = LEFT)#place(x=85+j, y=50)
self.ContentFrame = ttk.Frame(self.subframe, width = 600, height = 600)
self.ButtonsFrame = ttk.Frame(self.subframe)
ttk.Frame(self.ButtonsFrame).pack(side=LEFT, fill = X, expand=TRUE)
ttk.Button(self.ButtonsFrame, text='Inserisci', width='10').pack(side = LEFT)
ttk.Button(self.ButtonsFrame, text='Modifica', width='10').pack(side = LEFT)
ttk.Button(self.ButtonsFrame, text='Indietro', width='10').pack(side = LEFT)
ttk.Button(self.ButtonsFrame, text='Avanti', width='10').pack(side = LEFT)
ttk.Frame(self.ButtonsFrame).pack(side=RIGHT, fill = X, expand=TRUE)
self.LabelFrame.pack(side = TOP, fill = X, expand=TRUE)
self.ContentFrame.pack(fill = BOTH, expand = TRUE)
self.ButtonsFrame.pack(side = BOTTOM, fill = X, expand = TRUE)
if __name__ == '__main__':
root = tkinter.Tk()
root.title( "Double scrollbar with tkinter" )
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (0.99*w, 0.9*h))
applicazione(root)
root.mainloop()
这篇关于如何在python 3.4中使用tkinter添加2个滚动条?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!