Tkinter — Как передать переменную с помощью модулей?

#python #class #object #tkinter

Вопрос:

Мне нужно взять значение у пользователя, а затем передать это значение в функцию, чтобы получить строку с этими значениями. Мой код в первом файле выглядит так, как показано ниже (конечно, это упрощенная версия):

 import tkinter as tk
from tkinter import ttk
import myfunction  # this is my module that has another function

class Interface(ttk.Frame):

    def __init__(self, container):
        super().__init__(container)

        self.user_price_minimum = tk.StringVar()

        minimum_price = ttk.Label(self, text="Minimum price is: ")
        minimum_price.grid(row=0, column=0, padx=5, pady=5)
        minimum_price_entry = ttk.Entry(self, width=15, textvariable = self.user_price_minimum)
        minimum_price_entry.grid(row=0, column=1)
        minimum_price_entry.focus()

        #############
        button = ttk.Button(self, text="Use price")

        button.grid(column=0, rows=2, columnspan=2, padx=5, pady=5)

root = tk.Tk()
root.geometry("450x250")
root.title("Looking for a flat")
root.columnconfigure(0, weight=1)

frame = Interface(root)
frame.pack()

root.mainloop()
 

Мой другой файл python, который вызывает myfunction.py , должен иметь возможность взять это minimum_price у пользователя и добавить это в строку. Код выглядит так, как показано ниже:

 def minimum_price(self):
    price_min = self.user_price_minimum.get()
    price_min = int(price_min)

    print(f'Minimum price is: {price_min}')
 

Поэтому я не уверен, как я мог бы использовать minimum_price значения пользователя в этой функции.

Ответ №1:

Самое простое-сделать это:

 button = ttk.Button(self, text="Use price", command=lambda: myfunction.minimum_price(self))
 

Однако вы также можете определить его как метод в самом классе:

 class Interface(ttk.Frame):
    
    def __init__(self, container):
        super().__init__(container)
    
        self.user_price_minimum = tk.StringVar()
            
        minimum_price = ttk.Label(self, text="Minimum price is: ")
        minimum_price.grid(row=0, column=0, padx=5, pady=5)
        minimum_price_entry = ttk.Entry(self, width=15, textvariable = self.user_price_minimum)
        minimum_price_entry.grid(row=0, column=1)
        minimum_price_entry.focus()
        
        #############
        button = ttk.Button(self, text="Use price", command=self.print_price)
        button.grid(column=0, rows=2, columnspan=2, padx=5, pady=5)  
        
    def print_price(self):
        price = self.user_price_minimum.get()
        print(f'Minimum price: {price}')
 

Мои личные предпочтения (при использовании другого файла в таком случае, как этот (хотя я, вероятно, предпочел бы определить это как указано выше)) было бы, если бы:

 # in the other file
def minimum_price(value):
    print(f'Minimum price: {value}')

# inside the class
button = ttk.Button(self, text="Use price", command=lambda: myfunction.minimum_price(self.user_price_minimum.get()))
 

Также в этом случае вам не обязательно это нужно StringVar , вы также можете просто получить значение с помощью:

 # assignment
self.minimum_price_entry = ttk.Entry(self, width=15)

# get value (probably in some function call, basically the same way as with the `StringVar` except less code)
self.minimum_price_entry.get()
 

Комментарии:

1. Спасибо, приятель! Это работает с лямбдой. И спасибо за второй вариант, но я хотел бы сохранить свою функцию в другом файле python

2. @Tmiskiewicz кстати в текущей функции, вам не нужно конвертировать значение int , вы не только печатью (лицевые стороны для расчетов, если вы позже добавить вам может понадобиться целочисленное значение (в этом случае поскольку это будет пользовательский ввод, вы, вероятно, нужно добавить какой — try/except либо if statements проверки или поймать ошибку, если значение не может быть преобразовано в целое))

3. command=print_price должно быть command=self.print_price .