Задать вопрос
Ответы пользователя по тегу Tkinter
  • Почему не видит путь/экзешник?

    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() для внутреннего круга.
    Надеюсь, формула для расчёта координат границы у тебя есть.
    Ответ написан
    Комментировать
  • Как использовать multiprocessing в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Исходи из того, что между процессами лучше передавать только примитивные типы данных и простые коллекции (списки, кортежи, словари). Так что не надо передавать объекты Tkinter как есть, извлеки из них требуемые данные и передавай их.
    EDIT:
    Идеальный сценарий - использование пары multiprocessing.Queue.
    Код дочернего процесса слушает одну очередь, и обрабатывает полученные там задания, а потом пишет в другую ответы.
    Код материнского процесса занимается работой с GUI, складывает задания в первую очередь, и время от времени мониторит вторую очередь на предмет новых ответов. Используй root.after() для мониторинга.
    Ответ написан
  • Как удалить пустую строку в Text Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    А если начальные координаты поставить 0.0?
    Ответ написан
    Комментировать
  • Как реализовать вкладки в Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    ttk.Notebook в помощь.
    import tkinter as tk
    from tkinter import ttk
    
    # root window
    root = tk.Tk()
    root.geometry('400x300')
    root.title('Notebook Demo')
    
    # create a notebook
    notebook = ttk.Notebook(root)
    notebook.pack(pady=10, expand=True)
    
    # create frames
    frame1 = ttk.Frame(notebook, width=400, height=280)
    frame2 = ttk.Frame(notebook, width=400, height=280)
    
    frame1.pack(fill='both', expand=True)
    frame2.pack(fill='both', expand=True)
    
    # add frames to notebook
    notebook.add(frame1, text='General Information')
    notebook.add(frame2, text='Profile')
    
    root.mainloop()
    Ответ написан
    Комментировать
  • Как очистить поле ввода в Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Удалить часть текста из поля ввода (Entry) можно методом delete().
    entry.delete(0, tk.END)
    А вставить методом insert()
    entry.insert(0, 'строка')
    Ответ написан
    2 комментария
  • Python. Tkinter + Selenium – не работает вывод функции через радиокнопку?

    Vindicar
    @Vindicar
    RTFM!
    > command='watch_filtr2'
    > command=show_message
    разницу видно? Первое у вас не работает, второе, как я понимаю, работает.
    Ответ написан
    3 комментария
  • Как произвести вывод промежуточных результатов вычисления в элемент tkinter?

    Vindicar
    @Vindicar
    RTFM!
    В большинстве случаев, когда изменяешь элемент управления, он не перерисовывает себя немедленно - он только принимает к сведению, что ему нужно будет перерисовать себя при первой возможности. А первая возможность ему представится, когда твой обработчик calc() закончит работу.

    Поэтому есть пара вариантов.
    1. вызывать внутри цикла в calc() root.update_idletasks(). Это приостановит твой обработчик и даст шанс элементам управления отрисоваться, а потом возобновит выполнение.
    2. Разбить обработчик на отдельные короткие (это важно!) итерации. В конце каждой итерации планировать выполнение следующей с помощью root.after(), если требуется. Тогда в промежутках между завершением текущей итерации и вызовом запланированной следующей ткинтер будет успевать отрисовываться.

    В обоих случаех следует предусмотреть/проверить, что будет если нажать на кнопку дважды. Я подозреваю, ничего хорошего, так что кнопку стоит отключить на время выполнения обработчика.
    Ответ написан
    4 комментария
  • Как переключать язык через radibutton?

    Vindicar
    @Vindicar
    RTFM!
    Не получается по вполне очевидной причине.
    Как следует из названия, root.mainloop() входит в бесконечный цикл, и крутится там, пока окно не будет закрыто. Это считается завершением программы, и только тогда mainloop() возвращает управление.

    А нажатие кнопки у тебя тоже реализовано через бесконечный цикл. Разумеется, работать может только один из них.
    Я бы посоветовал почитать повнимательнее доки на keyboard, и выкинуть цикл while True и вызов keyboard.wait().
    Вместо этого, либо попробуй добавить обработчик через keyboard.add_hotkey(), либо попробуй запланировать вызов своей функции через root.after().
    Внутри этой функции используй keyboard.is_pressed(), чтобы узнать, нажата ли клавиша. Тут будет ещё пачка подводных камней - нужно будет повторно запланировать вызов этой же функции, нужно будет игнорировать нажатие клавиш, если перевод уже сделали (чтобы пока держишь клавиши, комп не переводил непрерывно), и т.п.
    Первый способ проще, но нужно проверить, сработает ли.
    Ответ написан
    1 комментарий
  • Как настроить расширение frame'ов?

    Vindicar
    @Vindicar
    RTFM!
    self.surf.grid_columnconfigure(0, weight=1)
    self.surf.grid_columnconfigure(1, weight=1)

    Обозначит, что при расширении сжатии оба столбца должны расширяться одинаково.
    Если веса сделать, скажем, 3 и 1, то столбец с весом три "отъест" 75% дополнительного пространства, а с весом 1 - 25%. Если вес столбца 0, он не меняет размер.

    Аналогично есть метод .grid_rowconfigure().
    Ответ написан
    3 комментария
  • Как расположить несколько текстов в разных местах в label в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Используй несколько label'ов или рисуй текст сам на canvas'е.
    Ответ написан
  • Куда всунуть аргумент self?

    Vindicar
    @Vindicar
    RTFM!
    Для начала, что такое main() - метод или свободная функция? Если метод, метод вызывается как self.main(). Это азы синтаксиса Питона, их нужно знать прежде чем бросаться воевать с Ткинтером.
    Во-вторых, зачем лямбда? Если метод не требует параметров, то можно указать просто self.main без скобок. Лямбда нужна, если параметры, передаваемые кнопкой, не совпадают с параметрами, требуемыми методом.
    Ответ написан
    6 комментариев
  • Как исправить ошибку Python Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Дело в этом коде:
    data = result.split()
                fun_name = data[0]
                arg = data[1:]
                bank_fun[fun_name](arg)

    Вы разбиваете введённую строку по пробельным символам (в т.ч. табы и переводы строки), но не проверяете ни есть ли функция с таким именем, ни правильное ли количество параметров передано, ни правильно ли записаны числа. Т.е. если у вас более трёх пробельных частей в строке, то в arg попадёт более двух значений, а не все функции это позволяют.

    Кратковременное решение: добавьте отлов исключений и проверку корректности вводимого текста.

    Более долгое но правильное решение: не изобретайте велосипед, а освойте модуль argparse, чтобы удобно разбирать команды и контролировать их корректность. А для удобного разбора строки (в том числе фишек типа "завернуть строку с пробелами в кавычки чтобы считалась как один аргумент") используйте модуль shlex. Оба модуля в стандартной поставке питона.
    Ответ написан
    Комментировать
  • Как сделать конвертер единиц в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Для value_type пропиши callback на изменение значения.
    self.value_type = IntVar()
    self.value_type.trace_add('write', self.select_value_type)

    При этом метод select_value_type должен иметь сигнатуру вида
    def select_value_type(self, *args):
    В твоём случае параметры метода не важны, так как он связан с изменением одной переменной. Вот почему можно просто прописать *args.
    Ответ написан
    2 комментария