2016-08-09 13 views
0

私は非常にPythonには新しく、まだ読書段階です。私はここで議論する2つの質問があります。私はtkinterを使ってPythonベースのユーザーインターフェイスを開発する必要があります。これはRaspberry Pi2で実行する必要があります。バックグラウンドプロセスでは、複数のUDPソケットサーバー&クライアントを作成する必要があります。これもPythonベースです。複数のpython UDPソケットとUI

ユーザーが任意のボタンを押してコンボボックスから任意の値を選択すると、データをC++アプリケーションに送信する必要があります。同様に、C++アプリケーションから受け取ったメッセージでUIを更新する必要があります。

私は予想通りに動作するPythonで基本的なUIとUDPソケットを作成しました。 UDPソケットスクリプトにUIデータを送信し、そこからC++アプリケーションに送ることができるように、これを拡張する必要があります。

  1. 複数のUDPソケットをインスタンス化するにはどうすればよいですか? PythonでFD_SET、select()に似たものがありますか?
  2. main.pyスクリプトからUIとバックグラウンドUDPソケットスクリプトの両方を起動する方法はありますか?
  3. canvasをリージョン1、コンボボックスをリージョン2、ボタンをリージョン3、ラベル(labelframe)をリージョン4とし、異なるサイズで配置するようなC#領域の指定方法。

これは私のpythonのコードです:

from tkinter import * 
from tkinter import ttk 

class MainWindow(Frame): 
    def __init__(self): 
     Frame.__init__(self) 
     self.master.title("Test") 
     self.master.minsize(330, 400) 
     self.grid(sticky=E+W+N+S) 

    modeFrame = Frame(self) 
    actionFrame = Frame(self) 
    msgframe = Frame(self) 
    modeFrame.pack(side="top", fill="x") 
    actionFrame.pack(side="top", fill="x") 
    msgframe.pack(side="top", fill="x") 

    # Mode Frame 
    Label(modeFrame, text="Mode :", font="bold").pack(side="left") 

    modeFrame.canvas1 = Canvas(modeFrame, height=25, width=25) 
    modeFrame.setupled = modeFrame.canvas1.create_oval(5, 5, 20, 20, fill="green") 
    modeFrame.canvas1.pack(side="left") 
    Label(modeFrame, text="Setup Mode").pack(side="left") 

    modeFrame.canvas2 = Canvas(modeFrame, height=25, width=25) 
    modeFrame.setupled = modeFrame.canvas2.create_oval(5, 5, 20, 20, fill="black") 
    modeFrame.canvas2.pack(side="left") 
    Label(modeFrame, text="Run Mode").pack(side="left") 

    # Action Frame 
    Label(self, text="Select Coupon").pack(side="left") 
    self.value_of_combo = 'X' 
    self.combo("a,b,c") 
    Button(self, text="Accept", command=acceptCallback).pack(side="left") 
    Button(self, text="Reject", command=rejectCallback).pack(side="left") 
    Button(self, text="EndSession", command=endSessionCallback).pack(fill="both", expand="yes", side="bottom") 

    # Message Frame 
    self.label0frame = LabelFrame(msgframe, text="ID") 
    self.label0frame.pack(fill="both", expand="yes") 
    Label(self.label0frame, text="Waiting for Client ...").pack(side="left") 

    self.label1frame = LabelFrame(msgframe, text="Available Coupons") 
    self.label1frame.pack(fill="both", expand="yes") 
    Label(self.label1frame, text="Waiting for Client ...").pack(side="left") 

    self.label2frame = LabelFrame(msgframe, text="Scanned Code") 
    self.label2frame.pack(fill="both", expand="yes") 
    Label(self.label2frame, text="Scanned Code ...").pack(side="left") 

    self.label3frame = LabelFrame(msgframe, text="Status") 
    self.label3frame.pack(fill="both", expand="yes") 
    Label(self.label3frame, text="Status Message ...").pack(side="left") 


def newselection(self, event): 
    self.value_of_combo = self.comboBox.get() 
    print(self.value_of_combo) 

def combo(self,Values): 
    self.box_value = StringVar() 
    self.comboBox = ttk.Combobox(self, state="readonly", values=("a", "b", "c")) 
    self.comboBox.pack(side="left") 
    self.comboBox.set("a") 
    self.comboBox.bind("<<ComboboxSelected>>", self.newselection) 

def acceptCallback(): 
    print("send Accept Message to C++") 

def rejectCallback(): 
    print("send Reject Message to C++") 

def endSessionCallback(): 
    print("send EndSession Message to C++") 

if __name__ == "__main__": 
    app = MainWindow() 
    app.mainloop() 

UDPソケットコード:

import time 
import struct 
import socket 
import sys 

MYPORT = 51506 
MYGROUP_4 = '225.0.0.1' 

MYTTL = 1 # Increase to reach other networks 

def UDPmain(): 
    udpApp = udpsocket() 

class udpsocket(): 
    def __init__(self): 
     print('UDP Socket started') 
     group = MYGROUP_4 
     self.receiver('225.0.0.1') 

def sender(group): 
    addrinfo = socket.getaddrinfo(group, None)[0] 

    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 

    # Set Time-to-live (optional) 
    ttl_bin = struct.pack('@i', MYTTL) 
    if addrinfo[0] == socket.AF_INET: # IPv4 
     s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin) 
    else: 
     s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin) 

    while True: 
     data = repr(time.time()) 
     s.sendto(data + '\0', (addrinfo[4][0], MYPORT)) 
     time.sleep(1) 


def receiver(self,group): 
    print('Receiver') 
    # Look up multicast group address in name server and find out IP version 
    addrinfo = socket.getaddrinfo(group, None)[0] 

    # Create a socket 
    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 

    # Allow multiple copies of this program on one machine 
    # (not strictly needed) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

    # Bind it to the port 
    s.bind(('', MYPORT)) 

    group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0]) 
    # Join group 
    if addrinfo[0] == socket.AF_INET: # IPv4 
     mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) 
     s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 
    else: 
     mreq = group_bin + struct.pack('@I', 0) 
     s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) 

    # Loop, printing any data we receive 
    while True: 
     data, sender = s.recvfrom(1500) 
     while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's 
     print (str(sender) + ' ' + repr(data)) 

が親切UIと私が言及したコメントを見て

enter image description here

私は人々whに感謝するo全体の質問を通過する。それは長い

答えて

1
  1. Pythonはあまりにもselectを使用することができます維持するため申し訳ありません:FD_SETものは自動的に処理されhttps://docs.python.org/3.4/library/select.html?highlight=select.select#select.selectを参照してください。ファイル記述子(またはファイルオブジェクト)のリストを提供するだけです。

  2. ここにいくつかのオプションがあります。 1つは、単に他のスクリプトをメインコードに直接組み込み、multiprocessingを使用してエントリポイントを呼び出すことです。 https://docs.python.org/3.4/library/multiprocessing.html?highlight=multiprocess#the-process-classあなたは(3)tkinterものを知っている他の誰かに残し

(、os.spawnos.fork + os.execlsubprocess)を使用しているオペレーティング・システムに応じて、それらを別々に起動したい場合、他のオプションがあります。

関連する問題