Ответы пользователя по тегу Tkinter
  • Как вычесть результат функции из результата другой функции?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых тебе стоит поучить питон на более простых вещах, а потом уже браться за GUI.
    Во-вторых, пусть твои функции помещают результат своего расчёта в глобальную переменную, каждая в свою. Сейчас они записывают его текстом в интерфейс, а как число не сохраняют нигде.
    Ответ написан
    Комментировать
  • Позиционирование в tkinter не поддается логике?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, нельзя смешивать разные менеджеры в рамках одного контейнера. Если ты этого не понял, я фз что ты читал. Т.е. ты можешь гридом разместить несколько панелей, а потом каждую панель наполнять по-разному.
    Во-вторых, стоит чуть-чуть погуглить, и находишь вот такой материал где прямо прописано, что не так со свойством height (ну и width заодно).
    Height of the button in text lines (for textual buttons) or pixels (for images).

    Решение, мягко говоря, спорное, но оно документировано. Размер виджету нужен только как некоторое предпочтительное значение по умолчанию, так как вообще-то всей геометрией занимается выбранный менеджер геометрии. А раз уж хочешь использовать place, почему ты не обратил внимание на параметры width/height?
    В общем, не принимай собственную невнимательность за чужие ошибки.
    from tkinter import *
    
    frame_bot = Tk()
    frame_bot.geometry("640x480")
    # place() возвращает None, как и stack() / grid()
    Button(frame_bot, text="back", bg='gray').place(x=5, y=405, width=30, height=30) 
    Button(frame_bot, text="write", bg='blue').place(x=45, y=405, width=30, height=30)
    Button(frame_bot, text="home", bg='green').place(x=85, y=405, width=30, height=30)
    
    frame_bot.mainloop()
    Ответ написан
    1 комментарий
  • Как получить данные с функции, при нажатии на кнопку?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала неплохо бы осознать, что понятие "за функцией" существует и в пространстве, и во времени.

    В пространстве - ты описываешь в функции локальную переменную Key, которая не видна снаружи, в глобальной области видимости, а также не видна в других функциях. Если хочешь сохранить это значение глобально, объяви переменную снаружи функции, присвоив ей какое-то начальное значение (скажем, None), а внутри функции опиши переменную как global.

    Во времени - весь приведенный тобой код, вплоть до вызова root.mainloop() (который ты не привёл), выполняется в самом начале работы скрипта - еще до того, как на экране появится окно. Чтобы код мог использовать значение, которое было получено в рамках btn_click(), нужно, чтобы этот код выполнялся гарантированно после btn_click() или же внутри btn_click(), но после получения значения Key. Как это гарантировать - подумай сам. Либо обяжи пользователя нажимать на кнопки в строго определнном порядке, либо привяжи исполнение кода к вызову btn_click().
    Ответ написан
    Комментировать
  • Tkinter grid, как растянуть сетку на все окно?

    Vindicar
    @Vindicar
    RTFM!
    Адаптивность решается через rowconfigure() и columnconfigure().
    А вот сам вопрос кривой: тебе нужно окно на весь экран, или только виджет на всё окно? Это разные вещи, как бы.

    Если нужно растянуть один виджет на всё окно (root), то просто
    widget.pack(fill='both', expand=True)
    Ответ написан
  • Ошибка в 5 строке. как сделать без ошибки?

    Vindicar
    @Vindicar
    RTFM!
    Включаю режим телепатии... ошибка "SyntaxError: unexpected EOF while parsing"?
    Если да, то включить голову и подумать.
    Ты вызываешь a=eval(t.get()). Т.е. пытаешься выполнить код, записанный в поле ввода t.
    Учитывая, что у тебя интерфейс ещё только создаётся, в этом поле ввода сейчас пусто.
    Строка выполняется до того как ты увидишь окно и успеешь туда что-то ввести.
    Вот eval() и ругается на пустую строку.
    Собственно, замечания только 2.
    1. Напиши обработчик щелчка по кнопке, и забирай значение из поля ввода в этом обработчике.
    2. На кой огурец тебе eval()? Чем int() не устроил?
    Ответ написан
    5 комментариев
  • Как синхронизировать БД sqlite и виджет tkinter ttk.treeview?

    Vindicar
    @Vindicar
    RTFM!
    Питоновский модуль для sqlite этого не умеет, хотя sqlite сама по себе предоставляет update_hook. См stackoverflow.
    Более простое решение - периодически опрашивать сервер, но это может быть напряжно.

    Но с учетом твоего другого вопроса, PostgreSQL реализует синтаксис LISTEN/NOTIFY. Есть модули для питона, которые позволяют этим пользоваться. Периодический опрос всё ещё потребуется, но он будет потреблять куда меньше ресурсов, чем SELECT.
    Ответ написан
    Комментировать
  • Как синхронизировать два файла базы данных sqlite в приложении на python?

    Vindicar
    @Vindicar
    RTFM!
    Сделать нормальный сервер БД вместо SQLite. Возьми MariaDB, или Postgre, или что угодно.

    Потому что иначе всё равно придётся разрешать конфликты записей. Например, в таблице X один пользователь добавил запись A с id=10, а другой независимо добавил запись B с id=10. Придётся одну перенумеровывать. А если у них ещё и связанные записи в других таблицах?
    Ответ написан
    Комментировать
  • Почему не обновляется текстовый виджет Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    fan_gpu_info.after(1000, fan_gpu_info)
    Может, имелось ввиду это?
    fan_gpu_info.after(1000, fans_gpu)
    Ответ написан
    2 комментария
  • Как узнать индекс динамического виджета tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Есть два подхода. Один основан на лямбдах:
    for i in range(2):
        buttonFrame_update=Button(frame,text="Добавить", command= lambda arg=i: update_main_db(arg))

    Приём с аргументом лямбды необходим, чтобы сохранить текущее значение i - иначе в момент вызова лямбды она прочитает последнее значение i, а оно будет указывать на последнюю строку.

    Второй способ, которя я бы выбрал - написать свой виджет - строку таблицы. Тогда обработчик нажатия на кнопку сможет брать данные из экземплярной переменной.
    class MyTableRow(Frame):
        def __init__(self, master, *args, **kwargs):
            super().__init__(master, *args, **kwargs)
            self.widgets = []
            for i in range(3):
                widget = Entry(frame)
                widget.pack(side="left")
                self.widgets.append(widget)
            self.update_btn = Button(self, text = "Добавить", command = self.update_clicked)
            self.update_btn.pack(side="right")
            self.delete_btn = Button(self, text = "Удалить", command = self.delete_clicked)
            self.delete_btn.pack(side="right")
      
        def update_clicked(self):
            print(self.widgets[0].get())
        
        def delete_clicked(self):
            print("whatever")
    
    
    for i in range(2):
        item = MyTableRow(doth, borderwidth=2, relief="groove")
        frames.append(item)
        item.pack(side="top", fill="x")
    Ответ написан
    5 комментариев
  • Как убрать ошибку при выведении в окно типа text из текстового файла docx?

    Vindicar
    @Vindicar
    RTFM!
    if var == 0:
    Так не сработает. Нужно
    if var.get() == 0:
    Ответ написан
    Комментировать
  • Как грамотно использовать progress bar в коде?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужно дать ткинтеру шанс перерисоваться, и обработать другие оконные сообщения.

    pb.config(value=format(per))
    win.update_idletasks()
    Ответ написан
  • Почему в tkinter не обновляется текст на экране?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не понимаешь, что делаешь.
    btn_ent = Button(frame_btn, text='Ввести', font=100, bd=2, height=5, command=click())

    Ты присваиваешь в качестве обработчика щелчка по кнопке результат вызова функции click(). У неё нет ни одного return, так что она возвращает None.
    Если ты хотел назначить click() как обработчик, то нужно было указать саму функцию, а не результат её вызова.
    command=click


    Далее, сравнение
    txt == 'чтототам'
    некорректно, так как StringVar() и str - разные типы данных, и они не будут равны. Используй
    txt.get() == 'чтототам'
    . Одинокий вызов txt.get() в начале click() бесполезен, так как ты игнорируешь возвращаемое get() значение.

    Собственно, я не вижу где ты инициализируешь переменную txt. У тебя нет ни одного вызова txt.set().

    Ну и до кучи, присваивание TextR перед root.mainloop() ни на что не повлияет, так как она использовалась ранее.
    Если хочешь, чтобы присваивание переменной тут же отражалось в элементах управления, нужно использовать еще один StringVar(), и вызывать его метод .set() для смены значения.
    Ответ написан
    Комментировать
  • Как решить проблему с видимостью переменной root?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(content_types=['text'])
    def get_command(message):
        if message.text == "Start":
          root = tk.Tk()
          img = ImageTk.PhotoImage(Image.open('lol.png'))
          createNewWindow(root, img)
          root.mainloop()
        elif message.text == "Stop":
          root.destroy()

    Ух как всё запущено.
    Во-первых, если ты ввёл Start, то get_command() создаёт локальную root, настраивает её, и уходит в бесконечный цикл внутри root.mainloop(). Я не знаю как pytelegrambotapi разруливает это, но бот после такого должен просто встать колом, пока все окна не будут закрыты. Подозреваю что обработчик вызывается в отдельном потоке, но фз. В любом случае, не надо так делать. Лучше иметь один root, который крутится внутри mainloop() в отдельном потоке всё время работы скрипта, а окна создавать и удалять по мере надобности, не создавая и не убивая root.
    Вообще подружить бота с оконным интерфейсом - задача нетривиальная.
    Во-вторых, переменная root - локальная. Она существует только внутри того экземпляра get_command(), который был вызван с командой старт. Если ты вызываешь его с командой Stop, у тебя запускается отдельный экземпляр, где выполняется только ветка Stop - а в этой ветке root объявлен не был, он был объявлен только в ветке Start, в другом экземпляре.
    В-третьих, окна будут спамиться только на той машине где запущен бот. Это так, на всякий случай.
    Ответ написан
    Комментировать
  • Как найти объект по координатам в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Всё что мне приходит в голову - перебрать все виджеты и найти те, чей прямоугольник содержит искомую точку.
    winfo_x()/winfo_y() - позиция виджета относительно родительского виджета.
    winfo_rootx()/winfo_rooty() - если не путаю, позиция виджета относительно начала экрана.
    winfo_width()/winfo_height() - текущий размер виджета
    winfo_children() - список дочерних виджетов для данного виджета.

    Но зачем тебе это понадобилось? Может, есть способ попроще?
    Ответ написан
    3 комментария
  • Почему не видит путь/экзешник?

    Vindicar
    @Vindicar
    RTFM!
    Юра Милевский, вынеси код ядра в отдельный поток (через threading) или в отдельный процесс (через multiprocessing). В главном потоке/процессе оставь GUI.
    Общение организуй через threading.Queue или multiprocessing.Queue (смотря что используешь).
    У тебя GUI задаёт только настройки ядра, ведь так? Тогда ты когда опльзователь что-то меняет в GUI, ты кладёшь в очередь кортеж вида ("имя параметра", "значение параметра"). Ядро в свободное время проверяет наличие новых элементов в Queue, извлекает эти кортежи, и запоминает новые настройки уже локально у себя (например, в словаре). Ну и использует этот словарь, когда потребуется.

    Если потребуется усложнить взаимодействие, то усложни структуру данных, которую передаешь. Например, кортеж будет иметь вид ("Имя команды", ["параметры", "команды"]). Ядро должно будет эту команду уже как-то интерпретировать и выполнить. Так или иначе, ключевая идея такая - передаёшь через очередь только примитивные типы вроде строк и чисел, а также кортежи, списки и словари.

    А если понадобится передать что-то от ядра в GUI, то используй отдельную очередь, которую GUI будет проверять, а ядро - наполнять.
    Ответ написан
  • Как исправить ошибку в Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    У тебя нет такой строки в приведённом коде. Проверь, какой файл ты запускаешь.
    Ответ написан
  • Как разобраться с многопотоками в пайтоне?

    Vindicar
    @Vindicar
    RTFM!
    btn2=tk.Button(frame, text="start AutoClicker", bg="white", padx="50", pady="10")

    А почему тут должно что-то происходить? Я не вижу в твоем коде назначения обработчика щелчку по этой кнопке.
    Ответ написан
    5 комментариев
  • Не открывается окно tkinter?

    Vindicar
    @Vindicar
    RTFM!
    root.mainloop()
    Ответ написан
    Комментировать
  • Как нарисовать фигуру в pyhton с помощью TKinter?

    Vindicar
    @Vindicar
    RTFM!
    Используй canvas, метод create_polygon() для внешней границы, и creat_circle() для внутреннего круга.
    Надеюсь, формула для расчёта координат границы у тебя есть.
    Ответ написан
    Комментировать