2017-08-27 86 views
0

基本上我需要同時運行兩個while循環。原因是我需要一個循環來更新GUI,另一個來檢查程序是否連接到互聯網。所以也許這需要多線程,或者我只是一個網頁去解決我的問題。這裏是我的源代碼:如何製作True:兩個循環在python中同時運行

# -*- coding: utf-8 -*- 

import sys 
import urllib2 
from Tkinter import * 
import time 
import socket 

def daMainProgram(): 

    airid = 'http://www.aviationweather.gov/metar/data?ids={airid}&format=raw&hours=0&taf=off&layout=off&date=0'.format(airid=e1.get()) 

    website = urllib2.urlopen(airid) 

    website_html = website.read() 

    data_start = website_html.find("<!-- Data starts here -->") 

    br1 = data_start + 25 

    br2 = website_html.find("<br />") 

    metar_slice = website_html[br1:br2] 

    print("Here is the undecoded METAR data:\n"+metar_slice) 

    root2 = Tk() 

    root2.title("#Conection_Made#") 

    metar_dat_label = Label(root2, text="Here is the undecoded METAR data:") 

    metar_dat_label_ln_2 = Label(root2, text=metar_slice) 

    metar_dat_label.grid(row=0) 

    metar_dat_label_ln_2.grid(row=1) 


def _quit(): 
    sys.exit() 

def internet(host="8.8.8.8", port=53, timeout=3): 
    try: 
     socket.setdefaulttimeout(timeout) 
     socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port)) 
     return True 
    except Exception: 
     return False 
def tkupdate(): 
    while True: 
     root1.update() 

def internet_loop(): 
    while True: 
     out = internet() 
     if out == True: 
      connetion2internet.configure(text="YOU ARE CONNECTED TO THE INTERNET", fg="green") 
     if out == False: 
      connetion2internet.configure(text="YOU ARE NOT CONNECTED TO THE INTERNET", fg="red") 

root1 = Tk() 
root1.title("Welcome") 
warning = Label(root1, text="*********** WARNING REQURIES INTERET TO RUN ***********") 
warning.grid(row=0) 
connetion2internet = Label(root1, text="") 
connetion2internet.grid(row=1) 
airport_code = Label(root1,text="Enter Airport Code:") 
airport_code.grid(row=2, sticky="W") 
e1 = Entry(root1) 
e1.grid(row=2, sticky="E") 
button1 = Button(root1, text="Contunue", command=daMainProgram).grid(row=3, sticky="W") 
button2 = Button(root1, text="Quit", command=_quit) 
button2.grid(row=3, sticky="E") 

tkupdate() 
internet_loop() 
+1

你'tkupdate'功能,在本質上,Tkinters'mainloop'是什麼。您應該考慮使用主循環,以及如何使用'after'方法定期檢查互聯網連接。 – SneakyTurtle

+0

是的,我明白了,我通常使用主循環,但在這段代碼中,我希望對tkupdate具有與internet_loop 相同的控制權,如果您可以給出答案,請回答而不是評論 –

+0

當您使用一個GUI庫,真的應該只有**一個主循環。但是,許多庫爲您提供運行代碼的方式,就像它是主循環的一部分一樣。我在一段時間內沒有完成過Tkinter,但是看到[你如何在Tkinter的事件循環旁邊運行你自己的代碼?](https://stackoverflow.com/questions/459083/how-do-you-run-your- own-code-alongside-tkinters-event-loop)。這應該讓你知道你需要做什麼。 –

回答

1

如何處理下面的內容。產生兩個進程。每個人都可以並行運行,目標功能可以用自己的替換。

from multiprocessing import Process 
from time import sleep 

def func1(): 
    while True: 
     print("func1 up and running") 
     sleep(1) 

def func2(): 
    while True: 
     print("func2 up and running") 
     sleep(1) 


if __name__ == '__main__': 

    proc1 = Process(target=func1) 
    proc1.start() 

    proc2 = Process(target=func2) 
    proc2.start() 

輸出是:

func1 up and running 
func2 up and running 
func1 up and running 
func2 up and running 
func1 up and running 
func2 up and running 
func1 up and running 
func2 up and running 
... 
+0

出於某種原因,我嘗試了這個使用你的代碼,也在另一個項目上,它的工作,但是當我來到項目我問我得到這個錯誤: –

+0

該過程有分叉,並且不能安全地使用此CoreFoundation功能。你必須執行()。 歇上__THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY ___ YOU_MUST_EXEC __()調試(這是重複3次以上) Tcl_ServiceModeHook:通知未初始化 –

+0

@ Mr.Zeus你可能只需要產卵一個額外的進程(一個監控互聯網連接),同時運行的主應用程序在現有的主流程中。爲了從互聯網檢查過程中獲取信息,您可能需要使用一些共享內存,您可以定期從主循環中檢查更新。請參閱文檔:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Value –

相關問題