【问题标题】:Tkinter.Label not showing after button pressed按下按钮后 Tkinter.Label 不显示
【发布时间】:2017-08-27 11:17:32
【问题描述】:

我正在尝试制作,按下按钮后,我会在标签中显示获取的信息,但是,我似乎无法让标签出现在 GUI 中。我收到错误,当我按“Vartotojo informacija > 输入名称并按“rodyti informacija”时,我在这一行出现错误w.pack(LEFT)(应该是第 95 行):

完整的追溯:

'id' is not recognized as an internal or external command,
operable program or batch file.
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\lib\lib-tk\Tkinter.py", line 1542, in __call__
    return self.func(*args)
  File "tkinter-label-not-showing-after-button-pressed.py", line 96, in <lambda>
    myg1 = Button(virsus, text="Rodyti informacija", command=lambda: gauti())
  File "tkinter-label-not-showing-after-button-pressed.py", line 103, in gauti
    w.pack(LEFT)
  File "C:\Python\lib\lib-tk\Tkinter.py", line 1946, in pack_configure
    + self._options(cnf, kw))
  File "C:\Python\lib\lib-tk\Tkinter.py", line 1169, in _options
    for k, v in cnf.items():
AttributeError: 'str' object has no attribute 'items'

我的代码:

from Tkinter import *
import tkMessageBox
from sys import version_info
import subprocess

root = Tk()
root.title("Administravimas")

virsus = Frame(root)
virsus.pack()
apacia = Frame(root)
apacia.pack(side=BOTTOM)

def filtras():
    root = Tk()
    root.title("Filtravimas pagal uzklausa")
    root.geometry("300x100")
    tekstas = Text(root, height=1, width=15)
    tekstas.pack(side=TOP)
    virsus = Frame(root)
    virsus.pack()
    apacia = Frame(root)
    apacia.pack(side=BOTTOM)
    myg1 = Button(virsus, text="Filtruoti", command=lambda: gauti())
    myg1.pack(side=BOTTOM)

    def gauti():
        imti=tekstas.get("1.0", "end-1c")
        subprocess.call("grep -i '{imti}' /var/log/syslog > "
                        "logai/uzklausa/$(date +%d_%m_%Y.txt)".format(imti=imti),
                        shell=True)

def vartotojas():
    root = Tk()
    root.title("Filtravimas pagal vartotoju prisijungimus")
    root.geometry("300x100")
    tekstas = Text(root, height=1, width=15)
    tekstas.pack(side=TOP)
    virsus = Frame(root)
    virsus.pack()
    apacia = Frame(root)
    apacia.pack(side=BOTTOM)
    myg1 = Button(virsus, text="Filtruoti", command=lambda: gauti())
    myg1.pack(side=BOTTOM)

    def gauti():
        imti = tekstas.get("1.0", "end-1c")
        subprocess.call("grep -i '{imti}' /var/log/auth.log > "
                        "logai/vartotojai/$(date +%d_%m_%Y.txt)".format(imti=imti),
                        shell=True)

def portas():
    root = Tk()
    root.title("Atidaryti/uzdaryti portus")
    root.geometry("300x100")
    virsus = Frame(root)
    virsus.pack()
    apacia = Frame(root)
    apacia.pack(side=BOTTOM)
    myg1 = Button(virsus, text="Atidaryti porta")
    myg2 = Button(virsus, text="Uzdaryti porta")
    myg1.pack(side=LEFT)
    myg2.pack(side=LEFT)
    root.mainloop()

def administ():
    root = Tk()
    root.title("Administrouti vartotojus")
    root.geometry("400x100")
    virsus = Frame(root)
    virsus.pack()
    apacia = Frame(root)
    apacia.pack(side=BOTTOM)
    myg1 = Button(virsus, text="Kurti vartotoja")
    myg1.pack(side=LEFT)
    myg2 = Button(virsus, text="Naikinti vartotoja")
    myg2.pack(side=LEFT)
    myg3 = Button(virsus, text="Keisti vartotojo grupe")
    myg3.pack(side=BOTTOM)
    root.mainloop()

def informacija():
    root = Tk()
    root.title("Vartotoju informacija")
    root.geometry("400x100")
    tekstas = Text(root, height=1, width=15)
    tekstas.pack(side=TOP)

    virsus = Frame(root)
    virsus.pack()
    apacia = Frame(root)
    apacia.pack(side=BOTTOM)
    myg1 = Button(virsus, text="Rodyti informacija", command=lambda: gauti())
    myg1.pack(side=BOTTOM)

    def gauti():
        imti = tekstas.get("1.0", "end-1c")
        info = subprocess.call("id '{imti}' ".format(imti=imti), shell=True)
        w = Label(root, text= "info")
        w.pack(LEFT)

    root.mainloop()

myg1 = Button(virsus, text="Filtruoti pagal uzklausa", command=filtras)
myg2 = Button(apacia, text="Filtrouti pagal vartotoju prisijungimus", command=vartotojas)
myg3 = Button(virsus, text="Atidaryti/uzdaryti portus", command=portas)
myg4 = Button(apacia, text="Administruoti vartotojus", command=administ)
myg5 = Button(apacia, text="Vartotojo informacija", command=informacija)


myg1.pack(side=LEFT)
myg2.pack(side=RIGHT)
myg3.pack(side=LEFT)
myg4.pack(side=RIGHT)
myg5.pack(side=RIGHT)

root.mainloop()

【问题讨论】:

  • 部分或全部缩进不正确。
  • 添加了完整代码,其余部分未完成,但我只需要 def informacija() 部分的帮助
  • 我无法重现您所说的属性错误。按下了哪个按钮?请再次edit您的问题并将该信息以及完整的追溯添加到发生错误的行。
  • 我已经为您的问题添加了完整的追溯。问题是因为您试图创建多个 root = Tk() 对象。 Tkinter 不会与他们一起工作——只能有一个。相反,您可以使用tk.Toplevel 创建其他顶级窗口。
  • P.S.题外话:您可以使用Button(virsus, text="Filtruoti", command=gauti) 代替创建lambda,就像在Button(virsus, text="Filtruoti", command=lambda: gauti()) 之类的语句中所做的那样。请注意,gauti 后面有 no(),因此在构造 Button 时不会调用它。

标签: python python-2.7 tkinter label


【解决方案1】:

就我所见,声明w.pack(LEFT) 只需要一个关键字(即w.pack(side=LEFT)。没有关键字,它需要一个另一种类型的参数(当调用help(Button.pack) 时,你会看到这个位置参数会成为字典)

【讨论】:

  • 谢谢你,成功了。但是,现在当我按下“rodyti informacija”按钮时,标签给我显示“0”,当它假设显示有关用户的信息时。
  • @Lenton;我真的不明白你的意思?并且无法重现您的问题。您现在希望标签w 显示刚刚在文本框中输入的信息吗?然后在标签中指定so; w = Label(root, text = imti)(顺便说一句,在请求信息时,我认为通常小部件 Entry 会更好地完成这项任务。)
  • 我的意思是在我按下按钮后,shell命令使用文本框中的变量运行,一切正常,除了,我希望shell命令结果显示在标签中,但它显示“ 0" 在我的标签中,但是,在命令提示符下,shell 命令结果会正确显示。
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多