Tkinter -dynamieczne zakładki

0

Witam #BTW Cześć, jestem nowy ;)

Cały dzień bez powodzenie (opierając się na kilku przykładach), próbuje poskładać dynamiczne zakładki.

Kod poniżej ma jeden błąd, ale celowo tak go napisałem, żeby sprawdzić czy ogólnie działa.

from tkinter import *
import tkinter.ttk as ttk

root = Tk()

notb = ttk.Notebook(root)
notb.pack()

tab0 = Text(root)
tab0.insert(END, 'Hello World!\n')
tab1 = Text(root)
tab1.config(fg='red')
tab2 = Text(root)
tab2.tag_add('fr', '1.0', '1.0 wordend')
tab2.tag_configure('fr', background='yellow')

i = 0
for x in [tab0, tab1, tab2]:
	if i == 0:
		notb.add(x, text=f'Tab: One')
		i += 1
	else:
		notb.add(x, text=f'Tab: {i}')
	i += 1

i = 0
for x in tab0, tab1, tab2:
	x.insert(END, f'Text: {i}')
	i += 1

root.mainloop()

Kod działa, ale nie do końca go rozumiem i nie potrafię poskładać tego razem.

from tkinter import *
from tkinter import ttk

root = Tk()
note = ttk.Notebook(root)
note.pack(fill='both', expand='yes')
tabs = []

for n in (0, 1, 2):
    tabs.append(Frame(note))
    note.add(tabs[n], text = f'Tab {n}')

root.mainloop()

Chcę otwierać wybrane pliki, których zawartość umieszczona ma być w osobnych zakładkach.
Poradzi ktoś jak się za to zabrać?

PS Znalazłem przykład gdzie autor w parametrze podawał nazwę zakładki jako typ string i doklejł jej numer przez konkatenacje tj. note.add('tab'+str(x), text=f'tab:{x}'), ale nie działa :/

0

Jaki jest problem, co mówi debugger?

0

Nie sprawdzę teraz, ponieważ pisze z tel. Mam gdzieś kilka przykładów, których jak na złość nie mogę znaleźć, ale jeden, o którym wspomniałem jest poniżej
http://pl.dumkakvit.com/symbol/pl.python_1.html

0

@Pylukas: Nie rozumiem, w tym linku jest praktycznie to co chcesz jeśli dobrze to rozumiem. Natomiast ja proponuję zrobić krok w tył, jeśli nie dwa i zapoznać się z dokumentacją do Tkinter i "obiektami", których możesz użyć :)

EDIT.
Biorąc na tapet przykład z linku można więcej poczytać tutaj:
https://docs.python.org/3/library/tkinter.tix.html#tkinter.tix.NoteBook
http://tix.sourceforge.net/dist/current/man/html/TixCmd/tixNoteBook.htm

0

@Dregorio: Przespałem się i coś poskładałem ;)

from tkinter import *
from tkinter import ttk

root = Tk()
note = ttk.Notebook(root)
note.pack()
tabs = []

#filedialog.askopenfilenames
patch = ('C:/User/Desktop','D:/Program Files', 'E:/My Files')

for n in range(0, len(patch)):
    tabs.append(Text(note))
    note.add(tabs[n], text = f'{patch[n]}')

i = 0
for txt in tabs:
    txt.insert(END, f'Text z Pliku: {patch[i]}')
    i += 1

root.mainloop()

lub

from tkinter import *
from tkinter import ttk

root = Tk()
note = ttk.Notebook(root)
note.pack()
tabs = []

#filedialog.askopenfilenames
patch = ('C:/User/Desktop','D:/Program Files', 'E:/My Files')

for n in range(0, len(patch)):
    tabs.append(Text(note))
    note.add(tabs[n], text = f'{patch[n]}')
    tabs[n].insert(END, f'Text z Pliku: {patch[n]}')
root.mainloop()

Metoda open_file, która wywołuje metodę obiektu innej klasy i przekazuje jej w argumencie pliki

	def open_file(self, patch='C:/User'):
		self.patch = patch
		self.user_file =  filedialog.askopenfilenames(
			initialdir=self.patch,
			title="Open File",
			filetypes=(("Text File", "*.txt"))
	
		if self.user_file:
			self.list = (self.user_file)
			self.patch = self.user_file

			for self.user_file in self.list:
				self.user_file = open(self.user_file)
				self.text = self.user_file.read()
				text_box.update_text(self.text)
0

@Pylukas: W 2 wersji nie musisz korzystać z tabs, możesz to bezpośrednio na obiekcie zrobić. Wydaje mi się, że dobrą praktyką, jako "mikro optymalizacja" jest nie importować wszystkiego, a tylko to co trzeba.

0

Zrobiłem to tak

class textFrame(Frame):
	def __init__(self, window):
		super(textFrame, self).__init__()
		self.create_frame()
		self.create_notebook()
		self.create_notebook_tab('Ready')

	def create_frame(self):
		self.pack(fill=X)

	def create_notebook(self):

		geometry = {
			'padx'   : 2,
			'pady'   : 2,
			'side'   : LEFT,
			'fill' 	 : X,
			'expand' : True}
		
		self.tb = ttk.Notebook(self)
		self.tb.pack(**geometry)

	def create_notebook_tab(self, title):

		self.title = title
		self.frame = Frame(self.tb)
		self.tb.add(self.frame, text=self.title)
		self.scrollbar = Scrollbar(self.frame)
		self.text = Text(self.frame, yscrollcommand=self.scrollbar.set)
		self.scrollbar.config(command=self.text.yview)
		self.scrollbar.pack(side=RIGHT, fill=Y)
		self.text.pack(fill=X)

	def update_text(self, patch):
		self.patch = patch

		for n in range(len(self.patch)):
			self.filename = self.patch[n].split('/')[-1]
			text_box.create_notebook_tab(self.filename)
			
			self.file = open(self.patch[n])
			self.txt = self.file.read()
			self.text.insert(END, self.txt) 
  1. Za każdym razem tworzona jest jedna zakładka
    metoda init uruchamia metodę create_notebook_tabs z parametrem ''Ready" jako nazwa zakładki
  2. Metoda open_file uruchamia metodę update_text przekazując jej ścieżki do plików.
  3. Metoda update_text wykonuje metodę create_notebook_tabs tyle razy ile jest zaznaczonych plików i za każdym razem przekazuje jej inną ścieżkę ze zmiennej self.patch,

1 użytkowników online, w tym zalogowanych: 0, gości: 1