Програмиране на Python GUI с помощта на плъзгане и пускане, също включващо пренасочване на stdout

Аз съм нов в програмирането и нов в python. Току-що разработих първия си скрипт, той обработва файла, но в момента само от командния ред.

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

Прекарах няколко дни в опити да се ориентирам в разработката на Python gui и стигнах до заключението, че трябва да съм глупав.

Разгледах wxpython & Tkinter и също не разбирам, въпреки че Tkinter изглежда е по-лесният от двата. Дори съм разглеждал инструменти на wysiwyg като Boa Contricor & wxglade. Дори не разбирам как да ги използвам. Така или иначе бих предпочел просто да се придържам към моя редактор и код ръчно.

Моят проблем е следният:

Бих искал да създам прозорец на работния плот с 1 или два обекта, в зависимост от това кое работи най-добре. Ако само един обект, тогава текстово поле от някакъв вид, ако 2 обекта, тогава текстово поле и изображение.

Искам да мога да плъзгам файл от файловия мениджър и да го пускам в прозореца на моя скрипт, това е само за да предам имената на файловете на моя скрипт.

След това искам да пренасоча stdout към обект в прозореца на работния плот, така че целият изход от скрипта да се показва в прозореца на работния плот.

Не съм сигурен дали един обект може да прави и двете неща или не. Ако може, просто текстово поле би било достатъчно, иначе пуснете файлове върху изображение и пренасочете изхода към текстовото поле.

Намерих примери за плъзгане и пускане в мрежата, но нищо, което да включва пренасочване на stdout, и не успях успешно да модифицирам нито един от примерите, на които се натъкнах.

Ако някой мил има време да демонстрира как да постигна това, което искам и да обясни как работи, ще съм много благодарен!

----РЕДАКТИРАНЕ ----

Играх си с 2 примера и успях да хеширам 2-та заедно, за да направя това, което исках, да работи. Кодът е по-долу. Все още не е изчистено (стари коментари и т.н.), но работи.

#!/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 плъзгане и пускане на файлове Explorer към запис в tkinter джаджа

А също и примерът, любезно предоставен от Noelkd.

За да работи този код, трябва да създадете обвивката от първия пример. Освен това понастоящем кодът просто показва изтегления файл в прозореца, но променливата е на място, за да бъде предадена на скрипта, който работи зад интерфейса на GUI.


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, ако реша да тръгна по този път. Разбира се, това е другият проблем с много опции за разработка на GUI. Клинтън - 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

По-долу е даден лесен начин да поставите текст върху pixi.js (използвайки WebGL) платно.

Как можем да превъртаме/мащабираме показаната част от платното? (т.е. мишката надолу + плъзгане трябва да се движи...)

Пример за това, което бих искал да постигна: http://s419743653.onlinehome.fr/things/test2.htm

<!DOCTYPE HTML>
<html>
<head>
    <title>pixi.js example 1</title>
    <script src="pixi.js"></script>
</head>
<body>
    <script>
    var stage = new PIXI.Stage(0xFFFFFF);
    var renderer = PIXI.autoDetectRenderer(800, 600);
    document.body.appendChild(renderer.view);
    var text = new PIXI.Text("Hello World", {font:"50px Arial", fill:"black"});
  stage.addChild(text);
  renderer.render(stage);   
    </script>
    </body>
</html>
- person Clinton Moffat; 18.07.2013
comment
ако нямате повече проблеми, искате ли да маркирате това като отговор и да затворите въпроса? - person Noelkd; 21.08.2013

Разгледайте GTK. Това е наистина мощна библиотека. Не е от най-простите, това е факт, но след като разберете как работят нещата, става много по-лесно. Ето официалния урок

Ако все още използвате 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