Программирование графического интерфейса Python с использованием перетаскивания, а также с перенаправлением stdout

Я новичок в программировании и новичок в python. Я только что разработал свой первый скрипт, он обрабатывает файл, но пока только из командной строки.

Для меня это просто хобби, так что моя работа от этого не зависит :-)

Я провел несколько дней, пытаясь разобраться в разработке графического интерфейса Python, и пришел к выводу, что я, должно быть, глуп.

Я просмотрел wxpython и Tkinter и тоже не понял, хотя Tkinter кажется проще из двух. Я даже смотрел на инструменты wysiwyg, такие как Boa Contrictor и wxglade. Я даже не понимаю, как их использовать. В любом случае я бы предпочел просто придерживаться моего редактора и кода вручную.

Моя проблема заключается в следующем:

Я хотел бы создать окно рабочего стола с одним или двумя объектами, в зависимости от того, что работает лучше всего. Если только один объект, то какое-то текстовое поле, если 2 объекта, то текстовое поле и изображение.

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

Затем я хочу перенаправить стандартный вывод на объект в окне моего рабочего стола, чтобы весь вывод скрипта отображался в окне рабочего стола.

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

Я нашел примеры перетаскивания в Интернете, но ничего, что включало бы перенаправление stdout, и мне не удалось успешно изменить ни один из примеров, с которыми я столкнулся.

Если у кого-то найдется время продемонстрировать, как добиться того, чего я хочу, и объяснить, как это работает, я был бы очень признателен!

----РЕДАКТИРОВАТЬ ----

Я играл с двумя примерами, и мне удалось хэшировать их вместе, чтобы получить то, что я хотел. Код ниже. Он еще не очищен (старые комментарии и т.д.), но работает.

#!/usr/bin/python

# The next two lines are not necessary if you installed TkDnd
# in a proper place.

import os
from Tkinter import *
os.environ['TKDND_LIBRARY'] = '/home/clinton/Python/tkdnd2.6/'

import Tkinter
from untested_tkdnd_wrapper import TkDND


class Redir(object):
    # This is what we're using for the redirect, it needs a text box
    def __init__(self, textbox):
        self.textbox = textbox
        self.textbox.config(state=NORMAL)
        self.fileno = sys.stdout.fileno

    def write(self, message):
        # When you set this up as redirect it needs a write method as the
        # stdin/out will be looking to write to somewhere!
        self.textbox.insert(END, str(message))

root = Tkinter.Tk()

dnd = TkDND(root)

textbox = Tkinter.Text()
textbox.pack()

def handle(event):
    event.widget.insert(END, event.data)
    content = textbox.get("0.0",Tkinter.END)
    filename = content.split()

dnd.bindtarget(textbox, handle, 'text/uri-list')

#Set up the redirect 
stdre = Redir(textbox)
# Redirect stdout, stdout is where the standard messages are ouput
sys.stdout = stdre
# Redirect stderr, stderr is where the errors are printed too!
sys.stderr = stdre
# Print hello so we can see the redirect is working!
print "hello"
# Start the application mainloop
root.mainloop()

Примеры: перетаскивание файлов проводника python в запись tkinter виджет

А также пример, любезно предоставленный Noelkd.

Чтобы этот код работал, вы должны создать оболочку из первого примера. Также в настоящее время код просто отображает перетаскиваемый файл в окне, однако существует переменная для передачи в скрипт, который выполняется за интерфейсом графического интерфейса.


person Clinton Moffat    schedule 17.07.2013    source источник
comment
Вы новичок в программировании, новичок в программировании на python и новичок в программировании на gui, и вы думаете, что вы глупы всего через несколько дней? Ты слишком строг к себе. Требуются годы, чтобы быть действительно хорошим во всем этом, и по крайней мере несколько недель (если не месяцев) просто для того, чтобы иметь фундаментальное понимание, если вы действительно новичок в программировании.   -  person Bryan Oakley    schedule 17.07.2013


Ответы (2)


Если вы хотите использовать Tkinter:

from Tkinter import *
import tkFileDialog 


class Redir(object):
    # This is what we're using for the redirect, it needs a text box
    def __init__(self, textbox):
        self.textbox = textbox
        self.textbox.config(state=NORMAL)
        self.fileno = sys.stdout.fileno

    def write(self, message):
        # When you set this up as redirect it needs a write method as the
        # stdin/out will be looking to write to somewhere!
        self.textbox.insert(END, str(message))

def askopenfilename():
    """ Prints the selected files name """
    # get filename, this is the bit that opens up the dialog box this will
    # return a string of the file name you have clicked on.
    filename = tkFileDialog.askopenfilename()
    if filename:
        # Will print the file name to the text box
        print filename


if __name__ == '__main__':

    # Make the root window
    root = Tk()

    # Make a button to get the file name
    # The method the button executes is the askopenfilename from above
    # You don't use askopenfilename() because you only want to bind the button
    # to the function, then the button calls the function.
    button = Button(root, text='GetFileName', command=askopenfilename)
    # this puts the button at the top in the middle
    button.grid(row=1, column=1)

    # Make a scroll bar so we can follow the text if it goes off a single box
    scrollbar = Scrollbar(root, orient=VERTICAL)
    # This puts the scrollbar on the right handside
    scrollbar.grid(row=2, column=3, sticky=N+S+E)

    # Make a text box to hold the text
    textbox = Text(root,font=("Helvetica",8),state=DISABLED, yscrollcommand=scrollbar.set, wrap=WORD)
    # This puts the text box on the left hand side
    textbox.grid(row=2, column=0, columnspan=3, sticky=N+S+W+E)

    # Configure the scroll bar to stroll with the text box!
    scrollbar.config(command=textbox.yview)

    #Set up the redirect 
    stdre = Redir(textbox)
    # Redirect stdout, stdout is where the standard messages are ouput
    sys.stdout = stdre
    # Redirect stderr, stderr is where the errors are printed too!
    sys.stderr = stdre
    # Print hello so we can see the redirect is working!
    print "hello"
    # Start the application mainloop
    root.mainloop()

Это создает окно с кнопкой и текстовым полем с перенаправлением stdout.

В настоящее время в Tkinter вы не можете перетаскивать файлы в открытое окно tk (вы можете, если используете tkdnd), поэтому я включил другой способ получения пути к файлу.

Способ, который я включил для выбора файла, - это диалоговое окно askopenfilename из tkFileDialog, это открывает файловый браузер, и выбранный файл пути возвращается в виде строки.

Если у вас есть какие-либо вопросы или это не совсем то, что вы ищете, пожалуйста, оставьте комментарий!

person Noelkd    schedule 17.07.2013
comment
Привет Noelkd, спасибо, что нашли время, чтобы предоставить код. Я думал о том, чтобы сделать что-то подобное, но это не так гладко, как перетаскивание. По одной причине вы можете добавлять только один файл за раз, поэтому, если файлов много, это может занять довольно много времени. Потратив несколько дней на изучение этого, я могу подтвердить, что вы можете перетаскивать с помощью Tkinter, есть надстройка/оболочка под названием tkdnd, которая обеспечивает эту функциональность. Клинтон - person Clinton Moffat; 17.07.2013
comment
Мое понимание разработки графического интерфейса — это то, как все это объединяется. вам нужно создать классы, а затем в классах вы должны создать функции. Я просто удивлен. Я думал, что смогу делать что-то одной строкой кода за раз, без сложности. Клинтон. - person Clinton Moffat; 17.07.2013
comment
Это должно было прочитать мою проблему, а не мое предложение. Извините за плохой тип. Также спасибо за объяснение каждой строки, это действительно поможет мне разобраться с Tkinter, если я решу пойти по этому пути. Конечно, это другая проблема для многих вариантов разработки графического интерфейса. Клинтон - person Clinton Moffat; 17.07.2013
comment
К сожалению, tkinter не поддерживает перетаскивание между приложениями. Однако этот ответ показывает, как использовать расширение под названием tkdnd - person Bryan Oakley; 17.07.2013
comment
Был как раз в середине написания комментария, в котором говорилось, что я посмотрю на tkdnd позже. Только что получил файлы, но не знал, что делать дальше, спасибо @BryanOakley за ссылку. - person Noelkd; 17.07.2013
comment
Отредактируйте мой исходный вопрос. Объединил два примера, включая Noalkd, чтобы получить результат, который я искал. вы не увидите, что файл, перетащенный в окно, в настоящее время просто отображается в этом окне. Это нужно убрать. Переменная уже существует для передачи обратно в скрипт Python. - person Clinton Moffat; 17.07.2013
comment
Спасибо :-). на самом деле все еще есть одна небольшая проблема. Как создать переменную на основе перетаскиваемого файла. Я просматривал код вверху и внизу, но не вижу способа захватить имя файла, чтобы передать его обратно в мои сценарии. - person Clinton Moffat; 17.07.2013
comment
Я бы предложил отредактировать основной вопрос с проблемой, с которой вы сейчас сталкиваетесь. Затем мы можем найти правильное решение. - person Noelkd; 18.07.2013
comment
Я только что придумал, как назначать элементы, перетаскиваемые в список. Я изменил обработчик def. Отредактировал мой исходный пост, чтобы показать изменения. - person Clinton Moffat; 18.07.2013
comment
если у вас больше нет вопросов, вы хотите отметить это как ответ и закрыть вопрос? - person Noelkd; 21.08.2013

Посмотрите ГТК. Это действительно мощная библиотека. Не самый простой, это факт, но как только вы поймете, как все устроено, все станет намного проще. Вот официальное руководство.

Если вы все еще используете Python2, я думаю, вам следует использовать PyGTK, но он был заменен на gl (который описан в предыдущем уроке). Хорошее руководство по PyGTK можно найти здесь.

Для статического интерфейса вы можете использовать glade, который создает XML-файлы, которые затем считываются GTKBuilder для создания "реального » интерфейс. Первый учебник, который я нашел, доступен здесь

person Paco    schedule 17.07.2013
comment
Привет, Пако, спасибо, что указали на эти уроки. Определенный PyGTK выглядит интересно. Скачали PDF. Похоже, мне просто придется начать читать много страниц. Не моя сильная сторона. Также разочаровывает, поскольку это приостановит разработку моей программы, возможно, на месяцы, просто чтобы создать пару объектов :-( Разработка графического интерфейса меня удивила. Я думал, что для того, что я хотел сделать, достаточно нескольких строк кода, по-видимому, не ... Это сложнее, чем написать программу, но не имеет смысла, кроме как сделать программу красивой и более удобной для пользователя Еще раз спасибо, Клинтон. - person Clinton Moffat; 17.07.2013
comment
Это немного сложно в начале, но с хорошим учебником это довольно легко и просто. Удачи - person Paco; 17.07.2013