Найти - Пользователи
Полная версия: Не удаётся получить значение из tk.Spinbox. Как исправить?
Начало » GUI » Не удаётся получить значение из tk.Spinbox. Как исправить?
1
August
 import tkinter as tk
from tkinter import ttk
class Gui:
    def __init__(self):
    	
        self.application_window = tk.Tk()
        self.add_modifier = tk.IntVar()
        self.create_widgets()
    def create_widgets(self):
        add_modifier = tk.Spinbox(self.application_window, from_=0, to=999)
        add_modifier.pack()
        button = ttk.Button(self.application_window, text='check', command=self.check)
        button.pack()
    def check(self):
        print(self.add_modifier.get())
program = Gui()
program.application_window.mainloop()

Почему get() всегда возвращает ноль, вне зависимости от того, какое число выставлено в tk.Spinbox на момент нажатия кнопки? Как это исправить?
FishHook
 import tkinter as tk
from tkinter import ttk
  
class Gui:
    def __init__(self):
        self.application_window = tk.Tk()
        self.create_widgets()
  
    def create_widgets(self):
        self.add_modifier = tk.Spinbox(self.application_window, from_=0, to=999)
        self.add_modifier.pack()
        button = ttk.Button(self.application_window, text='check', command=self.check)
        button.pack()
  
    def check(self):
        print(self.add_modifier.get())
 
 
program = Gui()
program.application_window.mainloop()
py.user.next
FishHook
 self.add_modifier = tk.Spinbox
Не, там надо переменные делать. Просто он спинбокс не подключил к переменной.


  
#!/usr/bin/env python3
 
import tkinter as tk
from tkinter.constants import *
 
class App(tk.Frame):
 
    def __init__(self, master=None):
        super().__init__(master)
        self.pack(fill=BOTH)
        self.create_widgets()
 
    def create_widgets(self):
        self.spin_box_var = tk.IntVar()
        self.spin_box = tk.Spinbox(
            self, from_=0, to=999, textvariable=self.spin_box_var)
        self.spin_box.pack()
        self.button_ok = tk.Button(self)
        self.button_ok.pack()
        self.button_ok.config(text='Ok', command=self.push_button_ok)
 
    def push_button_ok(self):
        print(self.spin_box_var.get())
 
 
if __name__ == '__main__':
    root = tk.Tk()
    win = App(root)
    win.master.title('Window')
    win.master.geometry('300x70+500+500')
    root.mainloop()

August
Спасибо! Работает и первый, более простой вариант от FishHook. А в чём преимущество подключения дополнительной переменной, как у py.user.next?

Меня сбило с толку, что для разных виджетов почему-то разные способы. Например в случае с ttk.Checkbutton никакой self. приписывать спереди не надо, а просто переменная прописывается в атрибутах.
 dismiss_the_lowest = ttk.Checkbutton(self.application_window, variable=self.dismiss_the_lowest)
И после этого get() замечательно работает.
py.user.next
August
А в чём преимущество подключения дополнительной переменной, как у py.user.next?
В том, что ты не привязан к элементу ввода. То есть в данный момент ты общаешься только с переменной и пишешь код только для неё. А то, что она связана со спинбоксом, этот код не знает. Таким образом ты легко можешь заменить элемент ввода на другой и при этом код, обрабатыващий переменную, этого даже не заметит. Так ты можешь менять внешний вид графического интерфейса без переписывания тонн кода.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB