7

我是编程新手和 python 新手。我刚刚开发了我的第一个脚本,它处理文件,但目前只能从命令行。

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

我花了几天时间试图了解python gui开发并得出结论,我一定是愚蠢的。

我看过 wxpython & Tkinter & 也不明白,尽管 Tkinter 似乎是两者中更容易的。我什至看过像 Boa Contrictor 和 wxglade 这样的所见即所得工具。我什至不明白如何使用这些。无论如何,我宁愿手动坚持使用我的编辑器和代码。

我的问题是这样的:

我想创建一个包含 1 个或两个对象的桌面窗口,具体取决于最适合的对象。如果只有一个对象,则为某种文本框,如果为 2 个对象,则为文本框和图像。

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

我不想将标准输出重定向到我的桌面窗口中的一个对象,以便所有脚本输出都出现在桌面窗口中。

我不确定一个对象是否可以同时做这两件事。如果可以,那么仅一个文本框就足够了,否则将文件拖放到图像上并将输出重定向到文本框。

我在网上找到了拖放示例,但没有任何包含标准输出重定向的示例,并且我无法成功修改我遇到的任何示例。

如果某个善良的鞋底有时间展示如何实现我想要的并解释它的工作原理,我将不胜感激!

- - 编辑 - -

我一直在玩 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 将资源管理器文件拖放到 tkinter 条目小部件

还有 Noelkd 提供的示例。

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

4

2 回答 2

6

如果你想使用 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()

这样做是创建一个带有按钮和文本框的窗口,并带有标准输出重定向。

目前在 Tkinter 中,您无法将文件拖放到打开的 tk 窗口中(如果您使用tkdnd则可以),因此我提供了另一种获取文件路径的方法。

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

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

于 2013-07-17T12:33:57.960 回答
2

看看GTK。这是一个非常强大的库。不是最简单的,这是事实,但是一旦你了解了事物的工作原理,它就会变得容易得多。这是官方教程

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

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

于 2013-07-17T11:51:36.857 回答