【问题标题】:Is there a way to print a function inside of a tkinter window?有没有办法在 tkinter 窗口内打印函数?
【发布时间】:2021-04-28 05:45:34
【问题描述】:

我看过关于这个的帖子,但它们都与while (x) == True: 有关

我的函数没有这些。这些在 2 个单独的文件中。请帮忙! Screenshot of pycharm

我知道这是很多代码,但我已经花了几个小时在这上面,我真的不知道为什么会这样。我希望完整发布这个项目,我可以在窗口中打印功能。在这一点上,它甚至不需要是一个 tkinter GUI,如果你有任何其他你认为可以工作的 GUI,请告诉我。提前谢谢你。

代码

import random

moves = ["RU", "RD", "LD", "LU", "BL", "BR", "DR", "DL", "FL", "FR", "UL", "UR"]
dir = ["", "2"]
slen = random.randint(25, 30)

def scramble_gen():
    scramble = [0] * slen
    for x in range(len(scramble)):
        scramble[x] = [0] * 2
    return scramble

def scramble_replace(ar):
    for x in range(len(ar)):
        ar[x][0] = random.choice(moves)
        ar[x][1] = random.choice(dir)
    return ar

def valid(ar):
    for x in range(1, len(ar)):
        while ar[x][0] == ar[x-1][0]:
            ar[x][0] = random.choice(moves)
    for x in range(2, len(ar)):
        while ar[x][0] == ar[x-2][0] or ar[x][0] == ar[x-1][0]:
            ar[x][0] = random.choice(moves)
    return ar


def sprint(ar):
    for x in range(len(ar)):
        print(str(ar[x][0]) + str(ar[x][1]), end= " ")

s = scramble_replace(scramble_gen())'''

新文件

from tkinter import *
import random
from scrambler import *
window = Tk()
window.title("Bryson's Scrambler")
lbl = Label(window, text = sprint(valid(s)))
lbl.grid(column=0, row=0)

txt = Entry(window,width=10)

txt.grid(column=1, row=0)

def clicked():

    lbl.configure(text="Button was clicked !!")

btn = Button(window, text="Click Me", command=clicked)

btn.grid(column=2, row=0)

window.mainloop()

window.mainloop()

【问题讨论】:

  • 我不明白你认为“打印函数”是什么意思。
  • “我真的不明白为什么会这样。” - 为什么会发生what?您还没有解释它在做什么,以及它与您的预期有何不同。如果您遇到错误,请将完整的错误消息复制并粘贴到您的问题中。
  • 我不明白你想做什么 - 如果你想在 GUI 中显示一些文本,那么不要使用 print() 而是创建字符串并使用这个字符串放入 GUI(最终用print()显示它。

标签: python function user-interface tkinter


【解决方案1】:

你必须比这更具体一点,

我可以在窗口中打印功能。

您想将哪个功能打印到窗口中?如果您尝试使用函数应该“打印”的任何对象更新现有窗口,则不要完全打印它并返回对象本身。即,如果您的意思是函数 sprint(

然后你应该能够从 Tkinter 调用该函数,获取它返回的内容并将其添加到窗口中,然后 refresh 它。

【讨论】:

    【解决方案2】:

    而不是使用print() 创建单个字符串并使用return

    def sprint(ar):
        text = ""
    
        for x in range(len(ar)):
            #print(str(ar[x][0]) + str(ar[x][1]), end= " ")
            text += str(ar[x][0]) + str(ar[x][1]) + " "
    
        return text
    

    然后就可以了

    lbl = Label(window, text=sprint(valid(s)))
    

    编辑:

    更具可读性

    def sprint(ar):
        text = ""
    
        for a, b in ar:
            text += f'{a}{b} '
    
        return text
    

    或更短

    def sprint(ar):
        return ' '.join(f'{a}{b}' for a,b in ar)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2011-06-05
      • 2021-02-27
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多