【问题标题】:Optional input() statement可选的 input() 语句
【发布时间】:2013-12-12 23:29:19
【问题描述】:

我正在为我学校的公共驱动器创建一个即时通讯程序。除了小细节,我什么都有。在下面的代码中,它检查来自朋友的新消息并打印他们发送的最后一条消息。如果没有消息,它会这样说。问题是当它移动到代码的下一步时,它会等待用户输入。在您输入之前,它不会让您收到更多消息,因为程序会停止读取和搜索 while 循环并被输入语句捕获。我想知道是否有使输入语句可选的方法。说它不需要输入,但如果有输入,它会发送它并做它的事情。我似乎无法找到使输入语句可选的方法。任何想法或工作代码将不胜感激。如果您需要整个代码,我可以将其发送给您或发布给您。这是唯一对这个问题真正重要的代码。

        LastMessage = ""
        while Message:

            Path = "Message"+SendTo+"-"+UserName+".txt"

            if path.isfile(Path):

                LoadMessage = open(Path, "rb")
                NewMessage = pickle.load(LoadMessage)
                LoadMessage.close()

            else:
                NewMessage = "Sorry, No messages found"   

            if LastMessage != NewMessage:

                LastMessage = NewMessage
                print(NewMessage)
                print("")

            SendMessage = raw_input()  #--- This is where it gets caught up! ---

            Save = open("Message"+UserName+"-"+SendTo+".txt", "wb")
            pickle.dump(SendMessage, Save)
            Save.close()

【问题讨论】:

  • 如果我理解正确,您希望能够打印新消息并同时接收用户的输入?为什么不使用线程?

标签: python input optional statements messenger


【解决方案1】:

在我看来,您有两个主要选择:

  1. 同时输入和检查(各种选项,例如从标准库中搜索threading 或multiprocessing);或
  2. 输入超时和循环(参见例如How to set time limit on raw_input)。

【讨论】:

    【解决方案2】:

    所以听起来您想同时做两件不同的事情 - 寻找用户的输入并轮询来自其他用户的新消息。 Jonrsharpe 将线程作为解决此问题的首选方法,我同意这是最直接的方法。你需要做的是这样的:

        import threading
    
        class InputMessageThread(threading.Thread):
            def run(self):
                SendMessage = raw_input()  # This thread will hang here for input but thats 
                                           # OK as original thread will keep going
                Save = open("Message"+UserName+"-"+SendTo+".txt", "wb")
                pickle.dump(SendMessage, Save)
                Save.close()
    
        inputthread = InputMessageThread()
        inputthread.start()
    
        # rest of your code here
    

    虽然您可能想看看其他一些问题。例如,如果我了解您要正确执行的操作,您将拥有一个文件,其中包含从源用户到目标用户的消息。但是,如果源用户在处理此文件之前发送第二条消息,则第一条消息将被覆盖。在实践中,您可能永远不会看到这一点,但在您允许写入下一个消息之前进行某种握手以确保消息已实际发送将是一种更强大的方法。

    【讨论】:

    • 我计划添加更多功能来解决这个问题。我想那也会是个问题。我想我会为每个人创建一个列表。该列表将是消息列表。它会读取列表中有多少项目,并在创建新消息时添加 1。我认为这将是解决该问题的最佳方法。无论如何,感谢代码,我期待看到它是否像我希望的那样工作。 ^_^
    猜你喜欢
    • 2021-03-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多