@NeAnimeForever

Как запустить функцию из другого файла в Tkinter?

Не спорю, что ответ на мой вопрос есть в интернете, но почитав всю инфу я ничего не понял. Я пытаюсь запустить функцию из другого файла. но вылетает ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Texas\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
TypeError: __init__() missing 2 required positional arguments: 'price_pil' and 'price_shariki'


Вот код Main.py:
#------------------------------[Библиотеки]------------------------------------------------
from pricecalc import price
import pyuac #Библиотека для прав администрации
import sys #Билблиотека системы?
import os #Библиотека для консоли
import time #Библиотека для таймера(бездействие)
import tkinter as tk
#------------------------------[Проверка Админ.Прав]------------------------------------------------
if not pyuac.isUserAdmin(): #Если нет прав администратора
    pyuac.runAsAdmin() #Спрашивает права администратора
    sys.exit() #Убивает процесс
#------------------------------[Проверка]------------------------------------------------
if os.path.exists("C:\Program Files (x86)\ResaleCalc"): #Проверка на наличие папки по указанном пути
    time.sleep(0.1) #Таймер на 0.1 секунду
else: #Если нет папки
    os.mkdir("C:\Program Files (x86)\ResaleCalc") #Создает папку по указанному пути
#------------------------------[Окно]------------------------------------------------
window = tk.Tk()

window.title("ResaleStal; build 1.0.0")

window.geometry("400x300")

screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
x = (screen_width // 2) - (400 // 2)
y = (screen_height // 2) - (300 // 2)

window.geometry(f"400x300+{x}+{y}")

button = tk.Button(window, text="Change/Assign prices", command=price)

button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)

window.mainloop()


Вот код pricecalc.py:
#------------------------------[Библиотеки]------------------------------------------------
import os #Библиотека для консоли
import time #Библиотека для таймера(бездействие)
from colorama import Fore #Библиотека для цветного текста в консоли
from colorama import Style #Библиотека для стильного текста в консоли
#------------------------------[Консоль]------------------------------------------------
title = "ResaleCalc-Price; build 1.0.0" #Имя программы
os.system("mode con cols=58 lines=9") #Размеры окна
os.system(f"title {title}") #Ввод имени программы
#------------------------------[Функции]------------------------------------------------
class price:
    def __init__(self, price_pil, price_shariki): #Функция ввода переменных цен
        self.price_pil = price_pil
        self.price_shariki = price_shariki
        
    def ChAsPrice(self, price_pil, price_shariki):
        with open("C:\Program Files (x86)\ResaleCalc\RecVar.txt", "w") as Rec_Var: #Создаем текстовый документ с ценами
            self.price_pil = int(input(Fore.LIGHTCYAN_EX + " Цена а: ")) #Ввод цены
            self.price_shariki = int(input(Fore.LIGHTWHITE_EX + " Цена п: ")) #Ввод цены

            os.system('cls') #Чистим консоль

            print(Style.BRIGHT + " Внесение изменений...") #Обычное сообщение для сообщения о чистке консоли
            Rec_Var.write(f"Price_AnmDust:\n{price_pil}") #Записываем в .txt цену
            Rec_Var.write(f"\nPrice_PrtArtef:\n{price_shariki}") #Записываем в .txt цену
            time.sleep(0.5) #Таймер на 0.5 секунду

            os.system('cls') #Чистим консоль
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
@maximq
QA Engineer
Замените строку в main.py на:
button = tk.Button(window, text="Change/Assign prices", command= lambda: price(1, 2))

Значения цены при этом будут установлены 1 и 2 соответственно. Можете заменить их значениями из полей ввода Tkinter (tk.Entry).

Ваш файл pricecalc.py содержит класс (class) с вложенными функциями. Функция init принимает значения price_pil и price_shariki. А в функции ChAsPrice принимаются уже другие значения, введённые в консоль - не используя TKinter. Правильнее будет весь функционал перенести в GUI.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@va_k
В сообщении написано
TypeError: __init__() missing 2 required positional arguments: 'price_pil' and 'price_shariki'

Это происходит потому что вы забыли передать два аргумента в функцию, тут происходит вызов без этих параметров.
button = tk.Button(window, text="Change/Assign prices", command=price)

Хотя это кончено не просто вызов функции, а инициализация класса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы