Возврат значения после вызова функции с кнопкой в ​​Tkinter - PullRequest
2 голосов
/ 21 марта 2011
from Tkinter import *
from tkFileDialog import askopenfilename
from PIL import Image
def main():
    filename = askopenfilename(filetypes=[("Jpeg","*.jpg")])
return filename
root = Tk()
button = Button(root,text="Open",command=main)
button.pack()
root.title("Image Manipulation Program")
root.mainloop()

Я новичок в программировании в целом, но я пытаюсь создать программу обработки изображений через библиотеку Tkinter GUI. То, что мне нужно сделать в приведенном выше коде, это вернуть строку, которая хранится в имени файла, поэтому она находится в глобальной области видимости программы, и я могу ее использовать. Проблема в том, что я не знаю, как это сделать при вызове функции с помощью кнопки. Я не могу найти ответ на эту проблему ни на одном веб-сайте, поэтому буду признателен за помощь в решении этой проблемы.

Ответы [ 2 ]

6 голосов
/ 10 декабря 2012

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

from Tkinter import *

class Application(Frame):

    def main(self):
        self.filename = askopenfilename(filetypes=[("Jpeg","*.jpg")])

    def createWidgets(self):
        self.button = Button(root,text="Open",command=self.main)
        self.button.pack()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.filename = None
        self.pack()
        self.createWidgets()

root = Tk()
root.title("Image Manipulation Program")
app = Application(master=root)
app.mainloop()
2 голосов
/ 21 марта 2011

Как правило, использование глобальных переменных для передачи информации по вашей программе является плохой практикой. Однако, если вы действительно должны это сделать, используйте изменяемый тип данных (например, список или dict) в качестве глобальной переменной и измените ее содержимое из функции обратного вызова, main.

returned_values = {}    # Create an empty dict.
def main():
    returned_values['filename'] = askopenfilename(filetypes=[("Jpeg","*.jpg")])
    # returned_values['filename'] may now be accessed in the global scope.

Если вы собираетесь делать это часто, рассмотрите возможность реализации собственного класса для передачи информации.

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