У меня есть следующий код:Как добавить 2 полосы прокрутки с tkinter в python 3.4?
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()
запущенной Применение:
Я читать данные из файла Excel (функция lettura) , но я хотел бы добавить горизонтальную и вертикальная полоса прокрутки, которую я читаю в первую очередь:
Adding a scrollbar to a group of widgets in Tkinter
но используйте «сетку», которую я не использую, и я не могу связать свой двойной «для» «текст» с вертикальной полосой прокрутки (функция Lettura)
Следующий код редактируется с помощью полосы прокрутки, но не работает:
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()
и это: How to add a scrollbar to a window with tkinter? , не организовать как класс.
Как я могу реализовать 2 полосы прокрутки?
UPDATE
новая версия:
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()
ваш пример кода не работает (не хватает 'populate' функции. Кроме того, она даже не пытается добавить горизонтальную полосу прокрутки. Вы говорите, что«не работает», но что это значит Вы даже не пытаетесь добавить горизонтальную полосу прокрутки. С чем вы столкнулись? Создаете ли полосу прокрутки видимым? Горизонтальная, а не вертикальная? –
Мои проблемы связаны с функцией lettura и вертикальной полосой прокрутки, которую я попытался добавить во второй кусок кода. Мне нужна горизонтальная и вертикальная полоса прокрутки, но я даже не вижу видимую вертикальную полосу прокрутки. – user3798245
Часть проблемы заключается в том, что вы помещаете рамку внутри холста, но вы не помещаете что-либо внутри рамки Итак, кадр будет иметь размер 1x1. Я могу только догадываться, если это единственная проблема , так как код, который вы представили, не запускается. –