可选的input()语句

时间:2013-12-12 23:29:19

标签: python input optional statements messenger

我正在为我学校的共同驱动器创建一个即时通讯程序。除了小细节外,我的一切都在工作。在下面的代码中,它检查来自朋友的新消息并打印他们发送的最后一条消息。如果没有消息就这么说。问题是当它移动到代码的下一步时,它等待用户输入输入。在您输入之前,它不会让您再收到任何消息,因为程序会停止读取并搜索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()

2 个答案:

答案 0 :(得分:0)

我认为你有两个主要选择:

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

答案 1 :(得分:0)

所以听起来你想要同时做两件事 - 寻找用户的输入并轮询来自其他用户的新消息。 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

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