2016-02-14 4 views
0

Я довольно новичок в TKinter и пытаюсь преобразовать свой обычный код Python в графический интерфейс (код TKinter)! Я работаю над этим кодом, и до сих пор у меня был базовый макет, но у меня проблемы с кнопками кодирования и с использованием записей. Скорее всего, вы найдете много ошибок в моем коде, поэтому будьте предупреждены! : DКак назначить функцию кнопке в Python/TKinter?

У меня есть запись в верхней части окна, и я хочу, чтобы пользователь вводил число в запись, а затем я хочу использовать текст, введенный в записи в некотором коде (btn1()). Я также хочу, чтобы пользователь нажал кнопку, а затем кнопку, чтобы запустить код с метками внизу, где кнопки показывают результаты кода (метки в функции btn1()).

Во-первых, я хочу, чтобы пользователь вводил число в запись. Затем я хочу, чтобы пользователь нажал кнопку, расположенную под этой записью. Наконец, я хочу, чтобы результаты кода за кнопкой отображались под кнопками (в ярлыках!).

Вот мой код:

from tkinter import * 

class window_design: 

def __init__(self): 
    root=Tk() 
    root.title("Bag Weight") 
    root.geometry("500x700") 
    root.wm_iconbitmap('favicon.ico') 


    image=PhotoImage(file="Weight Program.png") 
    imagelabel=Label(root,image=image) 
    imagelabel.pack() 


    weightentrylabel=Label(root,text="Enter Weight!") 
    weightentrylabel.pack() 

    self.string=StringVar() 
    weightentry=Entry(root,textvariable=self.string) 
    weightentry.pack() 

    menutext=Label(root,text="What coin are you using?") 
    menutext.pack(side=LEFT) 

    values=['1p','2p','5p','10p','20p','50p','£1','£2','Exit'] 

    def btn1(self,btn1code): 
     p1=3.56 
     p1should=356 
     if (self.string.get()) > p1should: 
      weightdif=(self.string.get())-p1should 
      coins=weightdif/p1 
      labeldif=Label(text=weightdif) 
      labelcoins=Label(text=coins) 
     elif (self.string.get()) < p1should: 
      weightdif=p1should-(self.string.get()) 
      coins=weightdif/p1 
      labeldif=Label(text=weightdif) 
      labelcoins=Label(text=coins) 

    button1=Button(root,text="1p",command=btn1) 
    button1.pack(side=LEFT) 



    root.mainloop() 



window_design() 

В настоящее время я получаю эту ошибку:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\cjay2\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__ 
    return self.func(*args) 
TypeError: btn1() missing 2 required positional arguments: 'self' and 'btn1code' 

ответ

1

Вы должны использовать self.btn1 (btn1 является методом класса) в button1=Button(root,text="1p",command=btn1).

btn1() Вызывается с одним аргументом, и для этого требуется два аргумента, установите значение по умолчанию для btn1code или removeit (если вы его не используете).

Когда вы вызываете метод get() на StringVar(), он вернет строку, поэтому вам нужно будет преобразовать ее перед сравнением с целыми числами.

Чтобы показать результат в label, используйте self.result = StringVar(), затем позвоните по номеру self.result.set(a_string). Проверьте следующий код:

from tkinter import * 

class window_design: 

    def __init__(self): 
     root=Tk() 
     root.title("Bag Weight") 
     #root.geometry("500x700") 
     root.wm_iconbitmap('favicon.ico') 


     image=PhotoImage(file="Weight Program.png") 
     imagelabel=Label(root,image=image) 
     imagelabel.pack() 


     weightentrylabel=Label(root,text="Enter Weight!") 
     weightentrylabel.pack() 

     self.string=StringVar() 
     weightentry=Entry(root,textvariable=self.string) 
     weightentry.pack() 

     menutext=Label(root,text="What coin are you using?") 
     #menutext.pack(side=LEFT) 
     menutext.pack() 

     values=['1p','2p','5p','10p','20p','50p','£1','£2','Exit'] 

     button1=Button(root,text="1p",command=self.btn1) 
     #button1.pack(side=LEFT) 
     button1.pack() 

     #-------------------------------------------------- 
     self.result=StringVar() 
     resultlabel=Label(root, textvariable = self.result) 
     resultlabel.pack() 
     #-------------------------------------------------- 

     root.mainloop() 
    #------------------------------------- 
    def btn1(self): 
     p1=3.56 
     p1should=356 
     if not self.string.get(): return 

     value = int(self.string.get()) 
     if value > p1should: 
      weightdif = value - p1should 
      coins=weightdif/p1 

     elif value < p1should: 
      weightdif=p1should - value 
      coins=weightdif/p1 

     self.result.set(coins) 
    #----------------------------------- 



window_design() 
1

Вы определили btn1() нуждающимися аргумент, кроме self, но Tkinter называет это без него. Похоже, что вы даже не используя btn1code, так что вы можете изменить определение функции для def btn1(self):

0

вы можете объявить btn1code как переменный-член, и удалить его из определения функции, или если вы хотите функцию с аргументами из кнопки вызова; используйте функцию лямбда следующим образом:

button1=Button(root,text="1p",command=lambda: btn1(btn1code)) 
Смежные вопросы