Tkinter: Используйте кнопку Click, чтобы получить значение текстового поля и сохранить в HTML - PullRequest
0 голосов
/ 05 сентября 2018

Я создал небольшую программу, чтобы получить введенный пользователем текст и сохранить текст в HTML-файл. Вот мой пример маленькой программы.

from tkinter import *
from jinja2 import Template

root=Tk()
textBox=Text(root, height=2, width=10)
textBox.pack()
buttonSave=Button(root, height=1, width=10, text="Save",
                command=lambda: createCaseDetails())
buttonSave.pack()

def createCaseDetails():
    # Create The template html for case report
    t = Template("""
            <!DOCTYPE html>
            <html lang="en" >
                <head>
                    <meta charset="UTF-8">
                        <title>Case Report</title>
                </head>
                <body>
                    <h1><span class="blue">&lt;</span>Evidence<span class="blue">&gt;</span> <span class="yellow">System Information</pan></h1>
                    <h2>Created with love by bluebear119 </h2>
                    <h3>Case Description</h3>
                        <p>{{Case_Description}</p>
                </body>
            </html>
            """)

    f = open('Case Report.html', 'w')
    inputvalue = textBox.get("1.0", "end-1c")
    print(inputvalue)
    message = t.render(Case_Description=inputvalue)

f.write(message)
f.close()
print("Case Report.html file saved.")

mainloop()

Но когда я реализую это в своем огромном коде, я не могу использовать переменную, поскольку она принадлежит к тому же классу, но из переменной другой функции. Я определил функцию createCaseDetails () на верхнем уровне, но мое текстовое поле находится в другой функции, кнопка также находится в другой функции. Как я могу нажать кнопку и сохранить текст описания дела в html.

Текстовое поле и кнопка будут определяться в одном классе следующим образом:

Class CreateCaseInterface(Frame):

    def caseInformation(self):
        ...
        Case_Description_text=Text(self.caseInfoFrame,width=30,height=11,yscrollcommand=CaseDescripyscrollbar.set)
        Case_Description_text.grid(row =4, column =1,pady=5)

    def UACaseManagement(self):
        Executebtn = Button(self.UACaseManagementFrame, text="Execute for create and save the case file", command=createCaseDetails(self),width=30,height=5)
        Executebtn.grid(row=12,column= 4,sticky=W,pady=5,columnspan=2)


def createCaseDetails(self):
    ...
    # As I already know declare global is not the solution
    inputvalue = Case_Description_text.get("1.0", "end-1c")
    print(inputvalue)
    message = t.render(Case_Description_text=inputvalue)

Ошибка не может быть использована переменная Case_Description_text в функции createCaseDetails().

Полный код для огромного файла Ссылка: https://drive.google.com/open?id=1I8TPSPf8XmtaeJ3Vm9Pk0hM1rOgqIcaRMgVUNxyn8ok

1 Ответ

0 голосов
/ 05 сентября 2018

Вы не назначили ее как переменную класса, вы назначили ее как переменную в области видимости этой функции, поэтому, когда функция завершается, переменная уничтожается. Вам необходимо присвоить его атрибуту класса, используя self, т.е.

def caseInformation(self):
    self.Case_Description_text = ...

def createCaseDetails(self):
    # can then reference it here
    inputvalue = self.Case_Description_text.get()

Обычно рекомендуется назначать виджеты tkinter переменным класса, чтобы все ваши виджеты были доступны из других мест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...