I'm actually trying to create ttk.Spinbox
from tkinter.Spinbox
. I can manipulate codes below like ttk.Scrollbar
pattern. tkinter.Spinbox
button gives an old look for my GUI that is why i want to ttk.Spinbox
.
Edit:
I am using Python 3.4
on Windows 7 OS. I need a themed Spinbox widget. ttk.__init__
file has not Spinbox class/module. So, I open that file and wrote codes just like Scrollbar
class given below.
class Scrollbar(Widget, tkinter.Scrollbar):
"""Ttk Scrollbar controls the viewport of a scrollable widget."""
def __init__(self, master=None, **kw):
"""Construct a Ttk Scrollbar with parent master.
STANDARD OPTIONS
class, cursor, style, takefocus
WIDGET-SPECIFIC OPTIONS
command, orient
"""
Widget.__init__(self, master, "ttk::scrollbar", kw)
And codes that I placed into ttk.__init__.py
file. It inherits from tkinter.Spinbox
.
class Spinbox(Widget, tkinter.Spinbox):
"""spinbox widget."""
def __init__(self, master=None, **kw):
Widget.__init__(self, master, "ttk::spinbox", kw)
The test result given below is satisfactory.But there is an indent before content of Spinbox Widget
tkinter.Spinbox Widget
ttk.Spinbox Widget
Is there something wrong? Why an indentation occurs?
import tkinter as tk
import tkinter.ttk as ttk
class Spinbox(ttk.Widget):
def __init__(self, master, **kw):
ttk.Widget.__init__(self, master, 'ttk::spinbox', kw)
if __name__ == '__main__':
root = tk.Tk()
root.grid_columnconfigure(0, weight=1)
opts = { 'from_': 5, 'to': 10, 'increment': 1 }
sp1 = tk.Spinbox(root, from_=5, to=10)
sp1.grid(row=0, column=0)
sp2 = Spinbox(root, from_=5, to=10)
sp2.grid(row=1, column=0, columnspan=2, sticky="we",pady=2)
root.mainloop()
If you expand root window the ttk.Spinbox
spreads with it and an indentation occurs. I guess it is due to columnconfigure
but i need configuration for better look.
Tkinter widgets are used to add Buttons, Labels, Text, ScrollBar, etc., however, tkinter. ttk supports a variety of widgets as compared to tkinter widgets. Tkinter. ttk doesn't support Place, Pack() and Grid(), thus it is recommended to use tkinter widget with ttk.
Tkinter has both classic and themed widgets. The Tk themed widgets are also known as ttk widgets. The tkinter. ttk module contains all the ttk widgets.
Source code: Lib/tkinter/ttk.py. The tkinter. ttk module provides access to the Tk themed widget set, introduced in Tk 8.5. If Python has not been compiled against Tk 8.5, this module can still be accessed if Tile has been installed.
This appears to be a bug within Tk itself, and your Python code is simply exposing it. I converted your example code into straight Tcl/Tk and ran it against both Tk-8.5.17 and Tk-8.6.3 (via TclKits), and the same issue is happening there, too:
package require Tk 8.5
grid columnconfigure . 0 -weight 1
spinbox .spin -from 5 -to 10
grid .spin -row 0 -column 0
ttk::spinbox .spin2 -from 5 -to 10
grid .spin2 -row 1 -column 0 -sticky "ew" -pady 2
This is what the above code looks like when run:
It appears that the problem code is in the vistaTheme.tcl
file within the ttk
subdirectory, in the nested code beginning with ttk::style layout TSpinbox
:
ttk::style layout TSpinbox {
Spinbox.field -sticky nswe -children {
Spinbox.background -sticky news -children {
Spinbox.padding -sticky news -children {
Spinbox.innerbg -sticky news -children {
Spinbox.textarea -expand 1 -sticky {}
}
}
Spinbox.uparrow -side top -sticky ens
Spinbox.downarrow -side bottom -sticky ens
}
}
}
Specifically, if you remove the -sticky {}
bit from Spinbox.textarea -expand 1 -sticky {}
in the inner-most block, then it looks like the indentation goes away:
I'd suggest reading through the Tcl/Tk bug wiki here, then open a bug with them here for this issue. Wouldn't hold your breath, though. Tcl/Tk releases don't happen very often, because it's a pretty mature and stable language. If a fix is produced for Tcl/Tk, then you'll need to file a bug with the Python maintainers to get them to either update their internal copy of Tcl/Tk for the Windows releases or backport a fix.
It might be possible to work around the problem in Python by using ttk's styles and configuring the Spinbox.textarea
bit to unset the sticky attribute, however, I don't have an exact code snippet to do that at the moment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With