当前位置: 首页 > 面试题库 >

在函数运行时写入easygui文本框?

别永年
2023-03-14
问题内容

我当前正在使用easygui运行脚本以接收用户输入。在命令行中运行的旧脚本仅会打印用户在命令行中需要知道的所有内容,但是我将其更改为在需要输入时在新的easygui框中输出通知。

我想要做的就是取得进展,正在运行的功能内部的每个动作,在完成时打印到文本框中。在命令行中,我只能使用print "text"它,但无法在easygui中实时进行。目前,我正在添加一个列表,因此我有一个文本框,该文本框会在所有操作完成后显示函数的结果,但是我希望大型的文本框窗口弹出并在注释过程完成时将行打印出来。这可行吗?

这是我添加列表的方式:

result_list = []
record_str = "\n Polling has completed for 502."
result_list.append(record_str)
eg.textbox("Polling Status", "Daily polling completion status:", result_list)

问题答案:

我认为没有任何简单的方法可以使EasyGUI的textbox功能完成您想要修改的模块。由于它是一个函数,而不是一个类,因此您甚至无法从中派生子类以轻松重用其代码。

但是,创建一个单独的Tkinter窗口是完全可行的,该窗口使用我在comp.lang.python新闻组的线程中一次发现的某些代码的增强版本,仅在发送文本行时显示这些文本行。

原始代码旨在捕获并仅显示stderr通常没有stderr输出句柄的GUI应用程序的输出,因此该模块名为errorwindow。但是,我对其进行了修改,以便能够将其重定向到我开发的一个基于应用程序的窗口,stderr并重定向stdout到此类窗口easygui,但是我从来没有回避重命名它或更新其中的注释以提及stdout重定向的问题。;¬)

无论如何,该模块的工作方式是定义并创建一个文件类的两个实例,该实例在edOutputPipe时命名import,并将它们分配给通常在Python
GUI应用程序(在Windows中)的sys.stdoutsys.stderrI /
O流文件对象。当输出首先被发送到的这些任一个中,相同的模块启动为具有其单独的Python过程,和I /
O控管道与原来的处理。None``.pyw``stdin``stdout``stderr


发生了很多事情,但是如果没有其他事情,只需对其进行一些研究,可能会为您提供一些有关如何使easygui‘stextbox做自己想要的事情的想法。希望这可以帮助。

注意: 发布的代码是针对Python
2.x的,如果有人感兴趣的话,我对另一个问题的回答中有一个修改后的版本可以在Python
2和3中使用。

档案 errorwindow.py

# references:
#   https://groups.google.com/d/msg/comp.lang.python/HWPhLhXKUos/TpFeWxEE9nsJ
#   https://groups.google.com/d/msg/comp.lang.python/HWPhLhXKUos/eEHYAl4dH9YJ
#
#   Here's a module to show stderr output from console-less Python
#   apps, and stay out of the way otherwise. I plan to make a ASPN
#   recipe of it, but I thought I'd run it by this group first.
#
#   To use it, import the module. That's it. Upon import it will
#   assign sys.stderr.
#
#   In the normal case, your code is perfect so nothing ever gets
#   written to stderr, and the module won't do much of anything.
#   Upon the first write to stderr, if any, the module will launch a
#   new process, and that process will show the stderr output in a
#   window. The window will live until dismissed; I hate, hate, hate
#   those vanishing-consoles-with-critical-information.
#
#   The code shows some arguably-cool tricks. To fit everthing in
#   one file, the module runs the Python interpreter on itself; it
#   uses the "if __name__ == '__main__'" idiom to behave radically
#   differently upon import versus direct execution. It uses TkInter
#   for the window, but that's in a new process; it does not import
#   TkInter into your application.
#
#   To try it out, save it to a file -- I call it "errorwindow.py" -
#   - and import it into some subsequently-incorrect code. For
#   example:
#
#        import errorwindow
#
#        a = 3 + 1 + nonesuchdefined
#
#   should cause a window to appear, showing the traceback of a
#   Python NameError.
#
#   --
#   --Bryan
#   ----------------------------------------------------------------
#
#   martineau - Modified to use subprocess.Popen instead of the os.popen
#               which has been deprecated since Py 2.6. Changed so it
#               redirects both stdout and stderr. Added numerous
#               comments, and also inserted double quotes around paths
#               in case they have embedded space characters in them, as
#               they did on my Windows system.

"""
    Import this module into graphical Python apps to provide a
    sys.stderr. No functions to call, just import it. It uses
    only facilities in the Python standard distribution.

    If nothing is ever written to stderr, then the module just
    sits there and stays out of your face. Upon write to stderr,
    it launches a new process, piping it error stream. The new
    process throws up a window showing the error messages.
"""
import subprocess
import sys
import thread
import os

if __name__ == '__main__':  # when spawned as separate process
    # create window in which to display output
    # then copy stdin to the window until EOF
    # will happen when output is sent to each OutputPipe created
    from Tkinter import BOTH, END, Frame, Text, TOP, YES
    import tkFont
    import Queue

    queue = Queue.Queue(100)

    def read_stdin(app, bufsize=4096):
        fd = sys.stdin.fileno()  # gets file descriptor
        read = os.read
        put = queue.put
        while True:
            put(read(fd, bufsize))

    class Application(Frame):
        def __init__(self, master=None, font_size=8, text_color='#0000AA', rows=25, cols=100):
            Frame.__init__(self, master)
            # argv[0]: name of this script (not used)
            # argv[1]: name of script that imported this module
            # argv[2]: name of redirected stream (optional)
            if len(sys.argv) < 3:
                title = "Output Stream from %s" % (sys.argv[1],)
            else:
                title = "Output Stream "%s' from %s" % (sys.argv[2], sys.argv[1])
            self.master.title(title)
            self.pack(fill=BOTH, expand=YES)
            font = tkFont.Font(family='Courier', size=font_size)
            width = font.measure(' '*(cols+1))
            height = font.metrics('linespace')*(rows+1)
            self.configure(width=width, height=height)
            self.pack_propagate(0)  # force frame to be configured size
            self.logwidget = Text(self, font=font)
            self.logwidget.pack(side=TOP, fill=BOTH, expand=YES)
            # Disallow key entry, but allow copy with <Control-c>
            self.logwidget.bind('<Key>', lambda x: 'break')
            self.logwidget.bind('<Control-c>', lambda x: None)
            self.logwidget.configure(foreground=text_color)
            #self.logwidget.insert(END, '==== Start of Output Stream ====\n\n')
            #self.logwidget.see(END)
            self.after(200, self.start_thread, ())

        def start_thread(self, _):
            thread.start_new_thread(read_stdin, (self,))
            self.after(200, self.check_q, ())

        def check_q(self, _):
            log = self.logwidget
            log_insert = log.insert
            log_see = log.see
            queue_get_nowait = queue.get_nowait
            go = True
            while go:
                try:
                    data = queue_get_nowait()
                    if not data:
                        data = '[EOF]'
                        go = False
                    log_insert(END, data)
                    log_see(END)
                except Queue.Empty:
                    self.after(200, self.check_q, ())
                    go = False

    app = Application()
    app.mainloop()

else: # when module is first imported
    import traceback
    class OutputPipe(object):
        def __init__(self, name=''):
            self.lock = thread.allocate_lock()
            self.name = name

        def __getattr__(self, attr):
            if attr == 'pipe':  # pipe attribute hasn't been created yet
                # launch this module as a separate process to display any output
                # it receives.
                # Note: It's important to put double quotes around everything in case
                # they have embedded space characters.
                command = '"%s" "%s" "%s" "%s"' % (sys.executable,                # command
                                                   __file__,                      # argv[0]
                                                   os.path.basename(sys.argv[0]), # argv[1]
                                                   self.name)                     # argv[2]

                # sample command and arg values on receiving end:
                #   E:\Program Files\Python\python[w].exe                         # command
                #   H:\PythonLib\TestScripts\PyRemindWrk\errorwindow.py           # argv[0]
                #   errorwindow.py                                                # argv[1]
                #   stderr                                                        # argv[2]

                # execute this script as __main__ with a stdin PIPE for sending output to it
                try:
                    # had to make stdout and stderr PIPEs too, to make it work with pythonw.exe
                    self.pipe = subprocess.Popen(command, bufsize=0,
                                                 stdin=subprocess.PIPE,
                                                 stdout=subprocess.PIPE,
                                                 stderr=subprocess.PIPE).stdin
                except Exception:
                    # output exception info to a file since this module isn't working
                    exc_type, exc_value, exc_traceback = sys.exc_info()
                    msg = ('%r exception in %s\n' %
                            (exc_type.__name__, os.path.basename(__file__)))
                    with open('exc_info.txt', 'wt') as info:
                        info.write('msg:' + msg)
                        traceback.print_exc(file=info)
                    sys.exit('fatal error occurred spawning output process')

            return super(OutputPipe, self).__getattribute__(attr)

        def write(self, data):
            with self.lock:
                self.pipe.write(data)  # 1st reference to pipe attr will cause it to be created

    # redirect standard output streams in the process importing the module
    sys.stderr = OutputPipe('stderr')
    sys.stdout = OutputPipe('stdout')


 类似资料:
  • 问题内容: 当我尝试在Python 3.3中运行该代码时,该代码不执行任何操作。没有错误或任何东西。怎么了 问题答案: 您仍然必须 调用 该函数。

  • 我想实现一个读取文本文件并执行其中每一行的程序。 例如,如果我有这个txt文件: 以及以下Java程序: 我得到以下错误: 我知道该程序没有找到任何方法,但我不知道如何修复它。 提前感谢!

  • 函数名称:保存字符串到文件 函数功能: 将字符串 string 内容存入文件 函数方法 str = file.writeString (path,str,encode) 参数 类型 必填 说明 path string 是 需要写入的文件路径 str string 是 需要写入的文件内容 encode string 否 编码格式,不写默认为 utf-8 函数用例 path1 = "/sdcard/L

  • 本文向大家介绍如何写个函数在main函数执行前先运行?相关面试题,主要包含被问及如何写个函数在main函数执行前先运行?时的应答技巧和注意事项,需要的朋友参考一下 __attribute((constructor))void before()``{`` ``printf(``"before main\n"``);``}

  • 我需要帮助了解如何从函数运行导入代码! 正如你所看到的,我是新来的python. time语音是另一个. py文件,当我做运行。我试图通过一个函数来运行它,如果在列表中回答:timespeech.say时间(),我相信你应该把它作为,但我不确定之后会发生什么。请帮助!

  • 我有一个应用程序,用户可以写文章,他们将显示在一个网页上。而不是存储所有的文本在数据库中,我想写到一个文本文件并存储它的方式。问题是,我似乎无法让文件保持格式ie换行符。如果用户键入