2013-10-11 6 views
1

저는 파이썬과 tkinter를 사용하기 시작했습니다. 두 개의 콤보 박스와 '실행'버튼이있는 GUI를 만들었습니다. 두 개의 다른 옵션 'SPMI'와 'RFFE'가 있습니다. 스크립트에서 원하는 것은 다른 옵션을 선택하고 '실행'을 클릭하면 SPMI.py 또는 RFFE.py 파일을 실행해야한다는 것입니다.python tkinter 콤보 박스/버튼

도와주세요, 감사합니다

내 코드 :

import sys 
from Tkinter import * 



def callback1(): 
    os.system('SPMI.py') 

def callback2(): 
    os.system('RFFE.py') 

class MyOptionMenu(OptionMenu): 
    def __init__(self, master, status, *options): 
      self.var = StringVar(master) 
      self.var.set(status) 
      OptionMenu.__init__(self, master, self.var, *options) 
      self.config(font=('calibri',(10)),bg='white',width=12,fg='dark red') 
      self['menu'].config(font=('calibri',(10)),bg='white',fg='dark blue') 

      b1_1 = Button(Dragonfly, text = "Run", fg='blue',command=callback1) 
      b1_1.place(x=85,y=150) 


     b2_2= Button(Dragonfly, text = "Run", fg='blue',command=callback2) 
     b2_2.place(x=275,y=150) 


Dragonfly = Tk() 
Dragonfly.geometry('400x400+400+300') 
Dragonfly.title('Dragonfly') 
mainlabel = Label(text='Dragonfly Trigger Test',font=('calibri',(14)),fg='dark blue').pack() 


mymenu1 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI','RFFE') 
mymenu2 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI','RFFE') 
mymenu1.place(x=40,y=100) 
mymenu2.place(x=230,y=100) 
m1label = Label(text='Frame Trigger',font=('calibri',(12)),fg='dark green').place(x=57,y=60) 
m1labe2 = Label(text='External Trigger',font=('calibri',(12)),fg='dark green').place(x=240,y=60) 

Dragonfly.mainloop() 
+0

'수입 os'에 필요한 외에도, 문제는 무엇인가? – unutbu

+0

실행 버튼을 콤보 박스에 연결하지 않습니다. SPMI를 선택하고 실행을 클릭하면 SPMI.py가 실행되고 RFFE를 선택하고 실행하면 RFFE.py가 실행됩니다. – user2871897

답변

1

사용 self.var.get()가 콤보 상자의 값을 얻을 수 있습니다. 그런 다음 해당 값을 콜백 내부에서 사용하여 콜백의 동작을 콤보 상자의 설정에 따라 결정할 수 있습니다. place와 GUI를 구축하는 것은 결국 처음에 쉽게,하지만 복잡 그런데

import sys 
from Tkinter import * 
import subprocess 

class MyOptionMenu(OptionMenu): 
    def __init__(self, master, status, *options): 
     self.var = StringVar(master) 
     self.var.set(status) 
     OptionMenu.__init__(self, master, self.var, *options) 
     self.config(
      font=('calibri', (10)), bg='white', width=12, fg='dark red') 
     self['menu'].config(font=('calibri', (10)), bg='white', fg='dark blue') 

    def callback(self): 
     val = '{}.py'.format(self.var.get()) 
     print(val) 
     # subprocess.call([val]) 

Dragonfly = Tk() 
Dragonfly.geometry('400x400+400+300') 
Dragonfly.title('Dragonfly') 
mainlabel = Label(text='Dragonfly Trigger Test', font=('calibri', (14)), 
        fg='dark blue').pack() 

mymenu1 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI', 'RFFE') 
b1_1 = Button(Dragonfly, text="Run", fg='blue', command=mymenu1.callback) 
b1_1.place(x=85, y=150) 

mymenu2 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI', 'RFFE') 
b2_2 = Button(Dragonfly, text="Run", fg='blue', command=mymenu2.callback) 
b2_2.place(x=275, y=150) 

mymenu1.place(x=40, y=100) 
mymenu2.place(x=230, y=100) 
m1label = Label(text='Frame Trigger', font=('calibri', (12)), 
       fg='dark green').place(x=57, y=60) 
m1labe2 = Label(text='External Trigger', font=('calibri', (12)), 
       fg='dark green').place(x=240, y=60) 

Dragonfly.mainloop() 


. 새로운 위젯을 삽입하면 하드 코딩 된 좌표로 전체를 조작해야하기 때문에 레이아웃이 변경되는 것은 점점 어려워집니다. 또 다른 문제점은 위젯 레이아웃이 창 크기의 변경에 맞지 않는 것입니다. 그 이유

, 사람들은 레이아웃 위젯 pack 또는 grid을 사용하는 경향이 :

import sys 
import Tkinter as tk 
import subprocess 

class MyOptionMenu(tk.OptionMenu): 
    def __init__(self, master, status, *options): 
     self.var = tk.StringVar(master) 
     self.var.set(status) 
     tk.OptionMenu.__init__(self, master, self.var, *options) 
     self.config(
      font=('calibri', (10)), bg='white', width=12, fg='dark red') 
     self['menu'].config(font=('calibri', (10)), bg='white', fg='dark blue') 

    def callback(self): 
     val = '{}.py'.format(self.var.get()) 
     print(val) 
     # subprocess.call([val]) 

Dragonfly = tk.Tk() 
Dragonfly.geometry('400x400+400+300') 
Dragonfly.title('Dragonfly') 
Dragonfly.columnconfigure(0, weight=1) 
Dragonfly.columnconfigure(1, weight=1) 
mainlabel = tk.Label(text='Dragonfly Trigger Test', font=('calibri', (14)), 
        fg='dark blue').grid(row=0, column=0, columnspan=2, pady=20) 

mymenu1 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI', 'RFFE') 
mymenu1.grid(row=2, column=0, pady=10, padx=10,) 
b1_1 = tk.Button(Dragonfly, text="Run", fg='blue', command=mymenu1.callback) 
b1_1.grid(row=3, column=0, pady=10, padx=10,) 

mymenu2 = MyOptionMenu(Dragonfly, 'Select Protocol', 'SPMI', 'RFFE') 
mymenu2.grid(row=2, column=1, pady=10, padx=10,) 
b2_2 = tk.Button(Dragonfly, text="Run", fg='blue', command=mymenu2.callback) 
b2_2.grid(row=3, column=1, pady=10, padx=10,) 

m1label = tk.Label(text='Frame Trigger', font=('calibri', (12)), 
       fg='dark green').grid(row=1, column=0, pady=10, padx=10,) 
m1labe2 = tk.Label(text='External Trigger', font=('calibri', (12)), 
       fg='dark green').grid(row=1, column=1, pady=10, padx=10,) 

Dragonfly.mainloop() 
+0

덕분에 도움이되었지만 내 파이썬 스크립트를 실행하지 않을 것입니다 SPMI.py 또는 RFFE.py – user2871897

+0

걱정하지 마십시오. print (val) 대신 execfile (val)을 사용했지만 감사합니다. – user2871897