如何在tkinter中使用tklib小部件?

2024-05-14 00:18:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为tkinter寻找一个IP地址输入小部件,用于python3.7,在tklib中遇到了ipentry。你知道吗

https://core.tcl-lang.org/tklib/doc/trunk/embedded/www/tklib/files/modules/ipentry/ipentry.html#section2

这不是一个非常复杂的需要'重新创建轮子',有几个例子stackoverflow的IP输入框,但我真的很想了解如何使用tklib与tkinter模块和小部件。文献或例子似乎很少。以下是我取得的成绩:

首先,我必须告诉Python这个小部件是存在的。你知道吗


 import tkinter as tk
 root = tk.Tk()
 root.tk.call(‘package’,’require’,’ipentry’)

然后我为这个小部件创建了一个类。你知道吗

class iPentry(tk.Widget):
    def __init__(self, master):
        tk.Widget.__init__(self, master, '::ipentry::ipentry’)

然后我创建一个实例并将其打包到我的窗口中。你知道吗

enterIp = iPentry(root)
enterIp.pack()

到目前为止还不错。我看到一个窗口,里面有一个熟悉的IPV4地址输入框。
example of ipentry widget

问题是我还没有弄清楚如何使用get、complete或insert小部件命令。当我试图从我创建的enterIp小部件中获取时,我得到了一个错误。你知道吗

myip = enterIp.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'iPentry' object has no attribute 'get'

我怀疑我遗漏了一些语法概念。有什么建议吗?你知道吗


Tags: selfgetinit部件tkinterrootwidgetcall
2条回答

多亏了acw1668,我才得以克服一些愚蠢的错误,并把这一点弄清楚。下面是一些示例代码,供可能希望在Python中使用这些代码的其他人使用。他们是相当有限的,我发现了一些事情,没有工作,即使他们在lib页面上记录。但在某些情况下它们可能有用。rdial特别令人惊讶,因为它在视觉上是一个“指轮”,而不是一个典型的圆形表盘。我已经包括了一个屏幕截图,其中一些看起来像在Macos。你知道吗

此代码显示一个iEntry,其下面有一个标签,当您按enter键时,该标签将填充地址。然后有一组3个滑块,其值将显示在下面的标签中。然后是一个rdial,它的值显示在下面的标签中,最后是一个“伏特计”,它根据一个随机数来回跳动。好好享受。你知道吗

tklib controlwidgets

# This Python file uses the following encoding: utf-8
# Python 3.7 and Tk version 8.6
import sys
import tkinter as tk
import random

class iPentry(tk.Widget):
    def __init__(self, master):
        tk.Widget.__init__(self, master, '::ipentry::ipentry')

    def get(self):
        return self.tk.call(self._w, 'get')

    def complete(self):
        return self.tk.call(self._w, 'complete')

class CWslider(tk.Widget):
    def __init__(self, master, placeholder):
        tk.Widget.__init__(self, master, '::controlwidget::slider',
            {'variable':placeholder, 'from_':0, 'to':20, 'number':3,
            'width':55, 'background':'yellow'})

    def get(self):
        getvalue = self.tk.call(self._w, 'get')
        getvalue = [int(x) for x in getvalue]
        return getvalue

    def set(self, value):
        self.tk.call(self._w, 'set', value)

    def complete(self):
        return self.tk.call(self._w, 'complete')

class CWrdial(tk.Widget):
    def __init__(self, master):
        tk.Widget.__init__(self, master, '::controlwidget::rdial',
            {'width':50, 'orient':'vertical', 'height':100,  'background':'green'})

    def get(self):
        return self.tk.call(self._w, 'get')

    def complete(self):
        return self.tk.call(self._w, 'complete')


class CWvoltmeter(tk.Widget):
    def __init__(self, master, variable):
        tk.Widget.__init__(self, master, '::controlwidget::voltmeter',
            {'min':0, 'max':100, 'variable':variable})


def getIP(event):
    myip = enterIp.get()
    labelvar.set(myip)
    print(f"myip is {myip}")


def updating(master, myValuesvar, myvoltvar, interval):
    #we can't get value from placeholder because slider corrupts the IntVar?
    slidervalues = slider.get() #so we use the get method
    myValuesvar.set(slidervalues)
    mydialvalue.set(mydial.get())
    myvoltvar.set( random.randrange(0, 100, 1))
    root.after(interval, updating, root, myValuesvar, myvoltvar, interval)

root = tk.Tk()
root.geometry("300x550+280+0")
root.tk.call('package','require','ipentry')
root.tk.call('package','require','controlwidget')

enterIp = iPentry(root)
enterIp.pack()
labelIP = tk.Label(root, text="Show The IP")
labelIP.pack()

labelvar = tk.StringVar()
label2 = tk.Label(root, textvariable=labelvar)
label2.pack()
root.bind('<Return>', getIP)

myvalues = [5,15,3]
myValuesvar = tk.IntVar()
placeholder = tk.IntVar() #necessary for slider to change values
slider = CWslider(root, placeholder)
slider.pack()
slider.set(myvalues)
labelSlider = tk.Label(root, textvariable=myValuesvar)
labelSlider.pack()

mydialvalue = tk.StringVar()
mydial = CWrdial(root)
mydial.pack()
labeldial = tk.Label(root, textvariable=mydialvalue)
labeldial.pack()

myvoltvar = tk.IntVar()
myvolt = CWvoltmeter(root, myvoltvar)
myvolt.pack()

interval = 300 #milliseconds for GUI
updating(root, myValuesvar, myvoltvar, interval)
root.mainloop()
sys.exit()

您需要在包装类iPentry中定义get()函数:

def get(self):
    return self.tk.call(self._w, 'get')

实际上,如果您想调用ipentry提供的每个函数,就需要定义它们。你知道吗

相关问题 更多 >