#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
.