tkinter - как сделать отдельную кнопку гиперссылки в моем цикле?

avatar
Jeong In Kim
9 августа 2021 в 04:27
46
1
0

Я пытаюсь создать простую программу для открытия URL-адреса, если условие подходит.

Вот минимальный воспроизводимый пример.

from tkinter import *
import requests
from bs4 import BeautifulSoup
import webbrowser
import time

def call_back(event):
    input_id.delete(0,END)
    return None

def open_browse(url):
    webbrowser.open_new(url)



win = Tk()
win.geometry("150x150")
win.title("Example")

search_btn = Button(win)
search_btn.config(text="search")
search_btn.config(width=5,height=1)
search_btn.grid(column = 2, row = 2)


def search_chr():
    
    chr_list = ["test1","test2"]
    result = [(0,"test_r_1"),(0,"test_r_2")]
    var_dict = {}
    num = -1
    for ch in chr_list:
        num += 1
        var_dict["output%s" %num] = Entry(win, width = 10)
        
        
        if result[0] == 0:
            pass
        else:
            link_url = result[num][1]
            print(link_url)
            var_dict["o-button%s" %num] = Button(win, command=lambda aurl=link_url:open_browse(link_url))
            var_dict["output"+str(num)].insert(0, "Text")
            var_dict["output"+str(num)].grid(column = 0, row = 0+num, columnspan = 4, sticky=W, padx=5, pady=5)
            var_dict["o-button"+str(num)].config(text="URL")
            
            var_dict["o-button"+str(num)].grid(column = 4, row = 0+num, sticky=E, padx=5, pady=5)
            var_dict["output"+str(num)].config(state="disabled")

search_btn.config(command = search_chr)


win.mainloop()

Итак, если вы запустите код, будет кнопка. И если вы нажмете на нее, появится два набора меток с текстом и кнопка с URL-адресом. Когда вы нажимаете кнопку URL, должна открываться страница просмотра с заданным URL.

Поскольку вы видите печатный текст в своем терминале, URL должен быть "test_r_1" и "test_r_2" Но, если вы нажмете каждую кнопку, все кнопки будут направлены на "test_r_2". Кажется, он каким-то образом перезаписал и предыдущий "test_r_1".

Если бы кто-нибудь мог объяснить, как заставить каждую кнопку ссылаться на каждый URL-адрес, это было бы прекрасно. Спасибо, что заглянули, и я надеюсь, что вы можете помочь мне с этим.

Источник

Ответы (1)

avatar
Jeong In Kim
9 августа 2021 в 05:18
0

Хорошо, я обнаружил, что не совсем понимаю, как работает лямбда.

Итак, я изменил ключевое слово для поиска и нашел этот прекрасный вопрос и ответ.

Tkinter назначает кнопку в цикле с лямбдой

Я изменил

var_dict["o-button%s" %num] = Button(win, command=lambda aurl=link_url:open_browse(link_url))
        

в

var_dict["o-button%s" %num] = Button(win, command=lambda link_url=link_url:open_browse(link_url))

и это сработало.

Всем спасибо!

Xitiz
9 августа 2021 в 05:20
0

Я также не нашел никакой разницы, изменив это, и код вопроса, и измененный код у меня работают нормально? Я не понял ни вашего вопроса, ни этого ответа!

Jeong In Kim
9 августа 2021 в 05:23
0

Что ж, я проверил еще раз, но первый код все еще отправляет неправильный URL. если вы нажмете первую кнопку в первом коде, он откроет «test_r_2» вместо «test_r_1». и если вы попробуете ту же кнопку в исправленном коде, она выдаст вам «test_r_1»

Matiiss
9 августа 2021 в 07:12
0

Вам действительно не нужно было менять его таким образом, вы просто должны были использовать command=lambda aurl=link_url:open_browse(aurl) также, как работают и другие функции.

Jeong In Kim
10 августа 2021 в 02:10
0

@Matiiss Спасибо! Вот чему я научился. Я не знал, как лямбда присваивает переменные в циклах. Я думал, что сработает первый, но оказалось, что мне нужно было сопоставить эти два адреса в предложенном вами коде. Большое спасибо Матисс!