使用拖放进行Python GUI编程,还包含stdout重定向

时间:2013-07-17 11:05:43

标签: python user-interface tkinter wxpython stdout

我是编程和新手的新手。新的python。我刚刚开发了我的第一个脚本,它是prosesses文件,但目前仅来自命令行。

这对我来说只是一个爱好,所以我的工作不依赖于它: - )

我已经花了几天时间试图了解python gui development&得出结论我一定是傻瓜。

我看过wxpython& Tkinter&也不明白,虽然Tkinter似乎更容易从两者中解脱出来。我甚至看过像Boa Contrictor& Sons这样的所见即所得的工具。 wxglade。我甚至不明白如何使用它们。我更愿意坚持使用我的编辑器和放大器。无论如何都要手动编码。

我的问题是:

我想创建一个包含1个或2个对象的桌面窗口,具体取决于最佳效果。如果只有一个对象然后是某种文本框,如果是2个对象则是文本框&一个图像。

我希望能够从文件管理器拖放文件&将它们放在我的脚本窗口上,这只是将文件名传递给我的脚本。

我想将stdout重定向到桌面窗口中的对象,以便所有脚本输出都显示在桌面窗口中。

我不确定一个物体是否可以做两件事。如果它不仅仅是一个文本框就足够了,否则将文件拖放到图像和放大器上。将输出重定向到文本框。

我找到了拖拉机在网络上删除示例但没有包含stdout重定向的示例,&我无法成功修改我遇到的任何示例。

如果某种类型的鞋底有时间展示如何实现我想要的东西&解释它是如何工作的我会非常感激它!

----编辑----

我一直在玩两个例子&我设法将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 drag and drop explorer files to tkinter entry widget

此外,Noelkd也提供了这个例子。

为了使此代码有效,您必须从第一个示例创建包装器。目前,代码只显示窗口中的拖动文件,但是变量已经到位,可以传递到在gui界面后面运行的脚本。

2 个答案:

答案 0 :(得分:5)

如果你想使用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,则可以),因此我提供了另一种获取文件路径的方法。

我选择文件的方式是来自tkFileDialog的askopenfilename对话框,这会打开一个文件浏览器,所选的路径文件将作为字符串返回。

如果您有任何问题,或者这不符合您的要求,请发表评论!

答案 1 :(得分:1)

看看GTK。它是一个非常强大的库。这不是最简单的,这是一个事实,但是一旦你理解了事情是如何运作的,它就变得容易了。 这是official tutorial

如果oyu仍在使用Python2,我认为你应该使用PyGTK但它已被gl替换(在上面的教程中有描述)。可以找到PyGTK的一个很好的教程here

对于静态接口,您可以使用glade生成XML文件,然后由GTKBuilder读取以创建“真实”接口。我找到的第一个教程可用here