2015-05-26 5 views
-1

с bash при использовании Tkinter. То, что я пытаюсь сделать, - это небольшой графический интерфейс, который выполняет функцию системного вызова.Настройка переменных с использованием Tkinter

Я хочу иметь возможность устанавливать v1, v2, v3 в виде строковых элементов, используя графический интерфейс - они предназначены для использования в функции «команда».

def system_call(step_name, cmd): 
    try: 
     subprocess.check_call(cmd, shell=True) 

    except subprocess.CalledProcessError as scall: 
     print "Script failed at %s stage - exit code was %s" % (step_name, scall.returncode) 
     exit() 


def command(v1, v2, v3): 
    # Commandline string 
    return v1 + " " + v2 + " " + v3 

Ниже вы найдете интерфейс.

# Create and name the window 
     root = Tk() 
     root.title("GUI - TEST VERSION") 

     # Set the variables needed for function 

     v1 = StringVar() 
     v2 = StringVar() 
     v3 = StringVar() 

     # Make text entry box 
     w = Label(root, text="V1") 
     w.pack() 
     text_entry = Entry(root, textvariable = v1.get()) 
     text_entry.pack() 

     w = Label(root, text="V2") 
     w.pack() 
     text_entry = Entry(root, textvariable = v2.get()) 
     text_entry.pack() 

     w = Label(root, text="V3") 
     w.pack() 
     text_entry = Entry(root, textvariable = v3.get()) 
     text_entry.pack() 

     # Add a 'Run' button 
     b = Button(root, text="Run fuction", command= system_call(Command call, command(v1, v2,v3))) 
     b.pack() 

     # Call the GUI 
     root.mainloop() 

Получение ошибки, указывающей, что строковые объекты и объекты экземпляра не могут быть помечены.

+0

В чем конкретно ваш вопрос? Почему вы вызываете 'get', а не присваиваете сами объекты' StringVar' 'textvariable'? – jonrsharpe

+1

'command = system_call (команда (v1, v2, v3))' Это будет _call_ 'system_call', _not_ связывает функцию как обратный вызов кнопки. –

+0

Я хочу позвонить в системный вызов! - im получает ошибку, говоря, что объекты string и instance нельзя отбрасывать. – user3234810

ответ

4

Вы используете переменные в неправильном порядке.

Здесь вы хотите использовать саму переменную, а не содержание:

text_entry = Entry(root, textvariable=v1) # remove .get(), same for the other lines 

И здесь, вы хотите использовать содержание, а не переменная:

def command(v1, v2, v3): 
    return v1.get() + " " + v2.get() + " " + v3.get() # add .get() 

Кроме того, когда вы привяжите функцию system_call к кнопке, вы - , вызывая функцию и привязывая результат к command. Вместо этого используйте лямбда:

b = Button(root, text="Run fuction", command=lambda: system_call('Command call', command(v1, v2,v3))) 
+0

Спасибо! Сначала пойдите на это так немного запутался! – user3234810

+1

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