2014-09-08 8 views
0

Я новичок в Python и меня возникают проблемы с этим фрагментом кода:Python - запустить две команды одновременно

while true: 
    rand = random.choice(number) 
    print(rand)    
    enter_word = input("Write something: ") 
    time.sleep(5) 

Я хочу, чтобы иметь возможность вводить слова в консоли время, на в то же время, в случайном порядке отображаются случайные числа. Но новый номер появляется только после ввода слова. Каков наилучший способ заставить обе эти команды работать одновременно?

Нужно ли мне создавать поток или есть что-то более простое, что я могу сделать? И если мне нужно сделать нить, можете ли вы, пожалуйста, немного поработать над тем, как я ее создам?

Заранее спасибо

+0

Рассматривали ли вы создание графического интерфейса: текстовое поле для ввода и текстовую область для вывода? – jfs

+0

В конечном итоге я собираюсь создать графический интерфейс. Но разве это исправить мою проблему? – user2456977

+1

GUI обычно использует цикл событий, который упрощает выполнение действий одновременно, например, повторно вызывает функцию, которая заполняет текстовую область случайными числами, в то время как текстовые поля ждут ввода. – jfs

ответ

1

Это может быть достигнутый с использованием модуля многопроцессорности в python, пожалуйста, найдите код ниже

#!/usr/bin/python 
from multiprocessing import Process,Queue 
import random 
import time 

def printrand(): 
    #Checks whether Queue is empty and runs 
    while q.empty(): 
     rand = random.choice(range(1,100)) 
     time.sleep(1) 
     print rand 


if __name__ == "__main__": 
    #Queue is a data structure used to communicate between process 
    q = Queue() 
    #creating the process 
    p = Process(target=printrand) 
    #starting the process 
    p.start() 
    while True: 
     ip = raw_input("Write something: ") 
     #if user enters stop the while loop breaks 
     if ip=="stop": 
     #Populating the queue so that printramd can read and quit the loop 
     q.put(ip) 
     break 
    #Block the calling thread until the process whose join() 
    #method is called terminates or until the optional timeout occurs. 
    p.join() 
+0

Для печати чисел вам не требуется отдельный * процесс * и ждать ввода параллельно. Вы можете использовать [отдельный поток] (http://stackoverflow.com/a/25797189/4279) или даже [один поток] (http://stackoverflow.com/a/25769869/4279), чтобы сделать это. Кроме того, здесь вам не нужна «Очередь», вы можете использовать «Событие» вместо этого, как показано в [моем ответе] (http://stackoverflow.com/a/25797189/4279) – jfs

0

ожидания ввода и отображения некоторый случайный выход в то же время, вы можете использовать графический интерфейс пользователя (something with an event loop):

screenshot

#!/usr/bin/env python3 
import random 
from tkinter import E, END, N, S, scrolledtext, Tk, ttk, W 

class App: 
    password = "123456" # the most common password 

    def __init__(self, master): 
     self.master = master 
     self.master.title('To stop, type: ' + self.password) 

     # content frame (padding, etc) 
     frame = ttk.Frame(master, padding="3 3 3 3") 
     frame.grid(column=0, row=0, sticky=(N, W, E, S)) 
     # an area where random messages to appear 
     self.textarea = scrolledtext.ScrolledText(frame) 
     # an area where the password to be typed 
     textfield = ttk.Entry(frame) 
     # put one on top of the other 
     self.textarea.grid(row=0) 
     textfield.grid(row=1, sticky=(E, W)) 

     textfield.bind('<KeyRelease>', self.check_password) 
     textfield.focus() # put cursor into the entry 
     self.update_textarea() 

    def update_textarea(self): 
     # insert random Unicode codepoint in U+0000-U+FFFF range 
     character = chr(random.choice(range(0xffff))) 
     self.textarea.configure(state='normal') # enable insert 
     self.textarea.insert(END, character) 
     self.textarea.configure(state='disabled') # disable editing 
     self.master.after(10, self.update_textarea) # in 10 milliseconds 

    def check_password(self, event): 
     if self.password in event.widget.get(): 
      self.master.destroy() # exit GUI 

App(Tk()).master.mainloop() 
0

Я хочу иметь возможность вводить слова в консоли, в то же время на консоли появляются случайные числа.

#!/usr/bin/env python 
import random 

def print_random(n=10): 
    print(random.randrange(n)) # print random number in the range(0, n) 

stop = call_repeatedly(1, print_random) # print random number every second 
while True: 
    word = raw_input("Write something: ") # ask for input until "quit" 
    if word == "quit": 
     stop() # stop printing random numbers 
     break # quit 

где call_repeatedly() is define here.

call_repeatedly() использует отдельный поток для вызова print_random() функция повторно.

0

Вы должны одновременно запускать одновременно два одновременных потока, чтобы избавиться от такой блокировки. похоже, что есть два переводчика, которые запускают ваш код, и каждый из них выполняет конкретный раздел вашего проекта.

Смежные вопросы