2014-05-10 267 views
-1

我有兩個或多個python Tkinter文件。每個文件打開一個窗口,如何在一個主窗口中運行所有Tkinter窗口功能。例如:如何在一個窗口中打開多個Tkinter窗口

例如:我有兩個文件,一個是usbcam.py,它將打開USB攝像頭並給出視頻傳輸,另一個是ipcam.py,它會打開IP攝像頭並提供實時流式傳輸。兩個窗口如何使該在一個窗口

usbcam.py

import cv2 
import PIL.Image 
import PIL.ImageTk 
import Tkinter as tk 


def update_image(image_label, cv_capture): 
    cv_image = cv_capture.read()[1] 
    cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) 
    pil_image = PIL.Image.fromarray(cv_image) 
    pil_image.save('image3.jpg') 
    tk_image = PIL.ImageTk.PhotoImage(image=pil_image) 
    image_label.configure(image=tk_image) 
    image_label._image_cache = tk_image # avoid garbage collection 
    root.update() 


def update_all(root, image_label, cv_capture): 
    if root.quit_flag: 
     root.destroy() # this avoids the update event being in limbo 
    else: 
     update_image(image_label, cv_capture) 
     root.after(10, func=lambda: update_all(root, image_label, cv_capture)) 


if __name__ == '__main__': 
    cv_capture = cv2.VideoCapture() 
    cv_capture.open(0) # have to use whatever your camera id actually is 
    root = tk.Tk() 
    setattr(root, 'quit_flag', False) 
    def set_quit_flag(): 
     root.quit_flag = True 
    root.protocol('WM_DELETE_WINDOW', set_quit_flag) # avoid errors on exit 
    image_label = tk.Label(master=root) # the video will go here 
    image_label.pack() 
    root.after(0, func=lambda: update_all(root, image_label, cv_capture)) 
    root.mainloop() 

ipcam.py

import cv2 
import numpy as np 
import PIL.Image 
import PIL.ImageTk 
import Tkinter as tk 
import urllib 

stream = urllib.urlopen("http://192.168.2.195:80/capture/scapture").read() 
bytes_ = '' 


def update_image(image_label): 
    global bytes_ 
    bytes_ += stream.read(1024) 
    a = bytes_.find('\xff\xd8') 
    b = bytes_.find('\xff\xd9') 
    if (a != -1) and (b != -1): 
     jpg = bytes_[a:b+2] 
     bytes_ = bytes_[b+2:] 
     cv_image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), 
           cv2.CV_LOAD_IMAGE_COLOR) 
     cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) 
     pil_image = PIL.Image.fromarray(cv_image) 
     tk_image = PIL.ImageTk.PhotoImage(image=pil_image) 
     image_label.configure(image=tk_image) 
     image_label._image_cache = tk_image # avoid garbage collection 
     root.update() 


def update_all(root, image_label): 

    if root.quit_flag: 
     print "coming if" 
     root.destroy() # this avoids the update event being in limbo 
    else: 
     print "coming else" 
     update_image(image_label) 
     root.after(1, func=lambda: update_all(root, image_label)) 
def timer(interval = 100): 
    root.after(0, func=lambda: update_all(root, image_label)) 
    #................................................................................................. 
    root.after(interval, timer) 

if __name__ == '__main__': 
    root = tk.Tk() 
    setattr(root, 'quit_flag', False) 
    def set_quit_flag(): 
     root.quit_flag = True 
    root.protocol('WM_DELETE_WINDOW', set_quit_flag) 
    image_label = tk.Label(master=root) # label for the video frame 
    image_label.pack() 
    root.after(2, func=lambda: update_all(root, image_label)) 
    # timer() 
    root.mainloop() 

回答

1

您需要指定一個腳本作爲主腳本,並且在那個腳本中您可以使用另一個腳本import。下面是這樣使用Frame小窗口的簡單子類的一個例子:

主腳本(tkA.py):

from Tkinter import * 
from tkB import Right # bring in the class Right from secondary script 


class Left(Frame): 
    '''just a frame widget with a white background''' 
    def __init__(self, parent): 
     Frame.__init__(self, parent, width=200, height=200) 
     self.config(bg='white') 

if __name__ == "__main__": 
    # if this script is run, make an instance of the left frame from here 
    # and right right frame from tkB 
    root = Tk() 
    Left(root).pack(side=LEFT) # instance of Left from this script 
    Right(root).pack(side=RIGHT) # instance of Right from secondary script 
    root.mainloop() 

二次腳本(tkB.py):

from Tkinter import * 


class Right(Frame): 
    '''just a frame widget with a black background''' 
    def __init__(self, parent): 
     Frame.__init__(self, parent, width=200, height=200) 
     self.config(bg='black') 

if __name__ == "__main__": 
    # if this script is run, just do this: 
    root = Tk() 
    Right(root).pack() 
    root.mainloop() 

希望有幫助。

+0

嗨,謝謝你的幫助。請給我一個示例代碼,將main.py窗口分成四個等份,如左上角的first.py,右上角的second.py,third.py中的底部左側和第四.py在右下方。這將解決我的問題@謝謝你 – user3252056

+0

這是一個單獨的問題。您應該嘗試自己解決問題,如果遇到問題,可以針對該問題提出新的問題。 – atlasologist

0

首先工作,你需要把它列入頂部。所以在ipcam.py的頂部寫入'import usbcam'(不含引號)。