Как реагировать на события tkinter? - PullRequest
1 голос
/ 13 декабря 2010

Я делаю некоторую работу с GUI в python.Я использую библиотеку Tkinter.

Мне нужна кнопка, которая откроет файл .txt и выполнит этот бит обработки:

frequencies = collections.defaultdict(int)    # <-----------------------
with open("test.txt") as f_in:                  
    for line in f_in:
        for char in line:
            frequencies[char] += 1
total = float(sum(frequencies.values()))      #<-------------------------

Я начал с:

from Tkinter import *               
import tkFileDialog,Tkconstants,collections

root = Tk()
root.title("TEST")
root.geometry("800x600")

button_opt = {'fill': Tkconstants.BOTH, 'padx': 66, 'pady': 5}
fileName = ''
def openFile():
    fileName = tkFileDialog.askopenfile(parent=root,title="Open .txt file", filetypes=[("txt file",".txt"),("All files",".*")])
Button(root, text = 'Open .txt file', fg = 'black', command= openFile).pack(**button_opt)



frequencies = collections.defaultdict(int)    # <-----------------------
with open("test.txt") as f_in:                  
    for line in f_in:
        for char in line:
            frequencies[char] += 1
total = float(sum(frequencies.values()))      #<-------------------------



root.mainloop()

Теперь я не знаю, как собрать свой код, чтобы он работал при нажатии кнопки.

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010

Основная проблема была tkFileDialog.askopenfile() возвращает открытое file вместо имени файла. Это следующее, кажется, более или менее работает для меня:

from Tkinter import *
import tkFileDialog, Tkconstants,collections

root = Tk()
root.title("TEST")
root.geometry("800x600")

def openFile():
    f_in = tkFileDialog.askopenfile(
                            parent=root,
                            title="Open .txt file",
                            filetypes=[("txt file",".txt"),("All files",".*")])

    frequencies = collections.defaultdict(int)
    for line in f_in:
        for char in line:
            frequencies[char] += 1
    f_in.close()
    total = float(sum(frequencies.values()))
    print 'total:', total

button_opt = {'fill': Tkconstants.BOTH, 'padx': 66, 'pady': 5}
fileName = ''
Button(root, text = 'Open .txt file',
       fg = 'black',
       command= openFile).pack(**button_opt)

root.mainloop()

Для быстрого создания простых программ с графическим интерфейсом я настоятельно рекомендую EasyGUI , довольно мощный, но простой модуль Python на основе Tk для таких целей.

1 голос
/ 13 декабря 2010

Попробуйте что-то вроде этого:

class my_app():
    def __init__():
        self.hi_there = Tkinter.Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=Tkinter.LEFT)

    def say_hi():
        # do stuff

Вы также можете прочитать:

Это руководство по Tkinter,

И этот.

РЕДАКТИРОВАТЬ: ОП хотел пример с его кодом (я думаю), так что вот оно:

from Tkinter import *               
import tkFileDialog,Tkconstants,collections

class my_app:
    def __init__(self, master):
        frame = Tkinter.Frame(master)
        frame.pack()

        self.button_opt = {'fill': Tkconstants.BOTH, 'padx': 66, 'pady': 5}
        self.button = Button(frame, text = 'Open .txt file', fg = 'black', command= self.openFile).pack(**button_opt)

        self.calc_button = Button(frame, text = 'Calculate', fg = 'black', command= self.calculate).pack()

        self.fileName = ''

    def openFile():
        fileName = tkFileDialog.askopenfile(parent=root,title="Open .txt file", filetypes=[("txt file",".txt"),("All files",".*")])

    def calculate():
        ############################################### *See note
        frequencies = collections.defaultdict(int)    # <-----------------------
        with open("test.txt") as f_in:                  
            for line in f_in:
               for char in line:
                   frequencies[char] += 1
        total = float(sum(frequencies.values()))      #<-------------------------
        ################################################

root = Tk()

app = App(root)

root.title("TEST")
root.geometry("800x600")

root.mainloop()

* Примечание: нигде в вашем коде я не видел, откуда берутся коллекции, поэтому я не был уверен, что делать с этим блоком.В этом примере я настроил его запуск на

0 голосов
/ 13 декабря 2010

В вашей функции openFile(), сразу после того, как вы спросите у пользователя имя файла, введите свой код!

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