Właśnie zacząłem uczyć się Pythona w ciągu ostatnich kilku dni, aby wykonać programowanie aplikacji i poprzednie doświadczenie w rozwijaniu stron internetowych z PHP. Budowałem program, który przeanalizuje listę informacji, zbuduj tablicę zebranych zmiennych, a następnie załaduj i wypełnić szablon HTML z tych zmiennych w nowym oknie TKININ TKINEVELVEL. Nowe okno jest tworzone przez funkcję, która jest wywoływana przez polecenie menubara w oknie głównym. Wszystko, co zawiera, to pole tekstowe z paskami przewijania i kilka przycisków, które powinny pozwolić użytkownikowi wybrać cały tekst, skopiuj go do schowka i zamknij okno.

Problem, który mam, i jestem pewien, że prawdopodobnie będzie to prosta poprawka dla kogoś płynnego w Pythonie, jest to, że nie wiem, jak prawidłowo referencję wszystko podczas wywoływania funkcji wyboru i kopiowania z innych funkcji. Jeśli zdążyłem kod, jak gdyby pracuję tylko z jednego okna, wszystko działa zgodnie z oczekiwaniami:

import tkinter as tk

def clipit():
    textpop.clipboard_clear()
    textpop.event_generate("<<TextModified>>")
    textpop.clipboard_append(textarea.get('1.0', 'end'))
    textpop.update()
    
def textselect():
    textpop.event_generate("<<TextModified>>")
    textarea.tag_add('sel', "1.0", 'end-1c')

textpop = tk.Tk()
textarea = tk.Text(textpop, wrap="none")
textarea.pack(side="left", fill="both", padx=20, pady=20)
textarea.insert("1.0", "This is a test - Try to select all and copy!")
exitbutton = tk.Button(textpop, text="Close", command = textpop.destroy)
exitbutton.pack(side="right", padx=(5,20), pady=(0,20))
copybutton = tk.Button(textpop, text="Copy", command = clipit)
copybutton.pack(side="right",padx=5, pady=(0,20))
selectbutton = tk.Button(textpop, text="Select All", command = textselect)
selectbutton.pack(side="right",padx=5, pady=(0,20))
textarea.focus()
textpop.mainloop()

Jeśli spróbuję zrobić to samo, ale z funkcji (gdzie Textpop = Tk.Toplevel ()), już nie działa. Próbowałem przekazywać różne odniesienia do funkcji (rodziców, widżetu itp.) I odpowiednio modyfikując kod funkcji, ale nie miałem szczęścia do pracy. Na przykład:

import tkinter as tk

def clipit(parent,textwidget):
    parent.clipboard_clear()
    parent.event_generate("<<TextModified>>")
    parent.clipboard_append(textwidget.get('1.0', 'end'))
    parent.update()
    
def textselect(parent,textwidget):
    parent.event_generate("<<TextModified>>")
    parent.textwidget.tag_add('sel', "1.0", 'end-1c')

def textwindow(title,content):
    textpop = tk.Toplevel()
    textpop.title(title)
    textarea = tk.Text(textpop, wrap="none")
    textarea.pack(side="left", fill="both", padx=20, pady=20)
    textarea.insert("1.0", content)
    exitbutton = tk.Button(textpop, text="Close", command = textpop.destroy)
    exitbutton.pack(side="right", padx=(5,20), pady=(0,20))
    copybutton = tk.Button(textpop, text="Copy", command = lambda: clipit(textpop,textarea))
    copybutton.pack(side="right",padx=5, pady=(0,20))
    selectbutton = tk.Button(textpop, text="Select All", command = lambda: textselect(textpop,textarea))
    selectbutton.pack(side="right",padx=5, pady=(0,20))
    textarea.focus()
    textpop.mainloop()

window = tk.Tk()
window.title("Main Window")
launchbutton = tk.Button(window, text = "Launch Window", command = lambda: textwindow("Toplevel Popup", "Text Area Text"))
launchbutton.pack(padx=20,pady=20)
window.mainloop()

W moim głównym skrypcie (i tego przykładowego kodu) kliknięcie przycisku Wybierz wszystko spowodowałoby następujący błąd:

AttributeError: Obiekt "Toplevel" nie ma atrybutu "TextWidget"

Czy jest coś prostego, że właśnie brakuje, ponieważ jestem nowy w języku?

Edytuj: Zmieniono drugi przykład dla jasności, na podstawie komentarza Bryana.

2
DJT 7 październik 2020, 23:21

1 odpowiedź

Najlepsza odpowiedź

W trakcie budowania funkcjonalnego przykładowego skryptu, aby pomóc ludziom rozwiązywać to dla mnie, myślę, że znalazłem winprit:

parent.textwidget.tag_add('sel', '1.0', 'end-1c')

Wygląda na to, że mogłem być trochę zbyt specyficzny z moimi referencjami, jako usunięcie próby referencyjnej referencyjnej Naprawiono problem z wyborem zawartości textWidget. Musiałem również dodać skupić się wezwanie do TEXTWIDGET, aby to działać, co również rzuciłem w funkcję:

def textselect(parent,textwidget):
    parent.event_generate("<<TextModified>>")
    textwidget.focus()
    textwidget.tag_add('sel', '1.0', 'end')

Kiedyś miałem to wszystko, zrealizowałem również, że wybór tekstu jest redagentny i więcej wizualnych rzeczy, ponieważ funkcja kopiowania skopiuje całą zawartość pola tekstowego, niezależnie od tego, czy jest podświetlona.

Nie 100% pewności, że jest to najlepszy sposób na wykonanie tego wszystkiego, ale działa. Jeśli ktoś ma lepszą metodę, możesz go opublikować!

0
DJT 8 październik 2020, 00:37